Hilker: mySQL - datensätze mit einer id die weniger als x mal vorkommt

Hi Forum!

Hat von Euch jemand ne Ahnung, ob es irgendwie möglich ist, in einer Tabelle alle Datensätze die in einer Spalte ID weniger als X Mal den selben Wert enthalten zu finden?
Ich kann irgendwie nichtmal nen Ansatz finden um das Problem anzugehen.

Gruß und Danke für Vorschläge und Hilfestellungen,
   Markus

  1. Hi,

    Ich kann irgendwie nichtmal nen Ansatz finden um das Problem anzugehen.

    der Ansatz lautet GROUP BY mit HAVING.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. der Ansatz lautet GROUP BY mit HAVING.

      OK, Danke! Das Resultat sieht nun wie folgt aus:

      SELECT bt1.col1, bt1.id
      FROM table1  bt1
      JOIN table1  bt2
      ON bt1.id = bt2.id
      GROUP BY bt2.id HAVING count(bt2.id) < 10

      findet alles <10 vorkommen.

      Irgendwas zu meckern, oder hab ich's richtig verstanden?

      Gruß,

      1. Hallo

        OK, Danke! Das Resultat sieht nun wie folgt aus:

        SELECT bt1.col1, bt1.id
        FROM table1  bt1
        JOIN table1  bt2
        ON bt1.id = bt2.id
        GROUP BY bt2.id HAVING count(bt2.id) < 10

        findet alles <10 vorkommen.

        Irgendwas zu meckern, oder hab ich's richtig verstanden?

        Ja, das akzeptiert höchstens MySQL und das Ergebnis kann zufällig sein.
        Du solltest nach _allen_ Spalten gruppieren, auf die Du _keine_ Aggregatsfunktion anwendest. Jedes andere DBMS als MySQL weist sonst Deine Abfrage als syntaktisch fehlerhaft zurück.

        In deinem speziellen Fall sollte col1 direkt von id abhängen, so dass es vom Ergebnis her keinen Unterschied machen dürfte.

        Freundliche Grüße

        Vinzenz

        1. Hello,

          Du solltest nach _allen_ Spalten gruppieren, auf die Du _keine_ Aggregatsfunktion anwendest. Jedes andere DBMS als MySQL weist sonst Deine Abfrage als syntaktisch fehlerhaft zurück.

          Nur so aus Interesse am Sprachsinn nachgefragt:

          Ist das dann wirklich _syntaktisch_ falsch, oder wäre es nicht eher _semantisch_ falsch? Bezieht sich denn die Syntax einer SQL-Abfrage auch auf deren Sinn, oder nicht eher nur auf die richtige Schreibweise (und Reihenfolge) der Begriffe?

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hallo

            Du solltest nach _allen_ Spalten gruppieren, auf die Du _keine_ Aggregatsfunktion anwendest. Jedes andere DBMS als MySQL weist sonst Deine Abfrage als syntaktisch fehlerhaft zurück.

            Nur so aus Interesse am Sprachsinn nachgefragt:

            Ist das dann wirklich _syntaktisch_ falsch,

            Ja. Die SQL-Syntax verlangt das explizite Aufführen aller Spalten, die keine Aggregatsfunktion enthalten, in der GROUP-BY-Klausel. Das Fehlen einer solchen Spalte ist somit ein Syntax-Fehler und die Abfrage wird schon aus rein formalen Gründen als falsch zurückgewiesen.

            Freundliche Grüße

            Vinzenz

  2. Hallo

    Hat von Euch jemand ne Ahnung, ob es irgendwie möglich ist, in einer Tabelle alle Datensätze die in einer Spalte ID weniger als X Mal den selben Wert enthalten zu finden?

    Diese IDs ermittelst Du mit COUNT(), GROUP BY und der HAVING-Klausel

    Ich kann irgendwie nichtmal nen Ansatz finden um das Problem anzugehen.

    Für die anzuzeigenden Datensätze nimmst Du ein Subselect.

      
    SELECT                -- Gib mir  
        <spaltenliste>    -- die Datensätze  
    FROM                  -- aus meiner  
        <tabelle>         -- Tabelle,  
    WHERE                 -- deren  
        id IN (           -- id in der  
        SELECT            -- Liste der  
            id            -- ids  
        FROM              -- aus der  
            <tabelle>     -- Tabelle vorkommt  
        GROUP BY  
            id  
        HAVING  
            COUNT(id) < <maximalwert> -- deren Anzahl des Vorkommens unter Deinem  
    )                                 -- Vorgabewert liegt  
    
    

    Sollte in MySQL 4.1.x und neuer funktionieren :-)

    Freundliche Grüße

    Vinzenz

    1. Diese IDs ermittelst Du mit COUNT(), GROUP BY und der HAVING-Klausel

      Ja, hab ich schon, allerdings mit self join ohne subselect.
      trotzdem danke!

      Gruß, Markus