bleicher: GROUP BY prinzip? (MySQL)

Grüße,
gaanz kruze Frage -

SELECT * FROM tabellename GROUP BY spaltenname

führt zum "distinctergebniss" - ich kriege jeweils nur die ersten zeilen aus einer gruppe  mit gleichem wert.

verwende ich es falsch? wie kann man die zeilen bei der ausgabe gruppieren?

MFG
bleicher

  1. verwende ich es falsch? wie kann man die zeilen bei der ausgabe gruppieren?

    Wie Du es beschreibst ist die Ausgabe doch Gruppiert, und zwar nach 'spatenname' d.h. jeder Eintrag in 'spaltenname' ist im Ergebnis UNIQUE, d.h. nur ein mal Vorhanden.
    Du verwendest es richtig, allerdings wäre es gut zu wissen, was für eine Art von Ausgabe du überhaupt erzielen willst. Vermutlich ist Guppieren garnicht der richtige Ansatz.

    1. Grüße,

      Wie Du es beschreibst ist die Ausgabe doch Gruppiert, und zwar nach 'spatenname' d.h. jeder Eintrag in 'spaltenname' ist im Ergebnis UNIQUE, d.h. nur ein mal Vorhanden.
      Du verwendest es richtig, allerdings wäre es gut zu wissen, was für eine Art von Ausgabe du überhaupt erzielen willst. Vermutlich ist Guppieren garnicht der richtige Ansatz.

      ich habe es durch ORDER BY ersetzt -

      funktioniert, erwartet hätte ich aber, dass bei GROUP BY die ergebnisse so sortiert werden, dass Ergebnisse die in 'spaltenname' gleichen Wert haben, auch hintereinander ausgegeben werden (wörtlich - gruppiert).

      was ist denn der unterschied zwischen GROUP BY und DISTINCT, wenn beide dazu führen dass jeder wert in der gegebenen spalte nur einmal ausgegeben wird?

      MFG
      bleicher

      1. ORDER BY -> Sortiert nach Spalte(n) wobei ASC, DESC die Sortierreihenfolge festlegt.
        Beispiel: ORDER BY Spalte1 DESC. Spalte2 ASC, Spalte 3

        GRPUP BY -> Gruppiert nach Spalten - wie Du ja schon bemerkt hast und wird nötig wenn z.B. mehrere Tabellen mit einer Abfrage (JOIN) angesprochen und zusammengefügt werden, da dann einfach gesagt, eine neue Tabelle die jedes Feld aus Tabelle1 mit jedem aus Tabelle2 verknüpft und darstellt. Um dann aus ALLEN Varianten eine zielgerichtete Ergebnismenge zu bekommen, nutzt man GROUP BY um überflüssige einträge auszufiltern.

        DISTINCT (ROW) -> liefert lediglich keine gleichen Spalten (Zeilen) zurück.

  2. Hi,

    SELECT * FROM tabellename GROUP BY spaltenname

    führt zum "distinctergebniss" - ich kriege jeweils nur die ersten zeilen aus einer gruppe  mit gleichem wert.

    Ja, MySQL ist da etwas unsinnig. Andere Datenbanken verbieten solchen Unsinn, dort dürfen in der Spaltenauswahl bei Verwendung nur Gruppierungsfunktionen oder Spalten, die auch bei Group by angegeben sind, stehen.
    Und Du bekommst auch nicht die jeweils erste Zeile [1] von MySQL, sondern zufällig einen der Werte für die Spalte, die in der Gruppe auftreten. MySQL garantiert - IIRC - noch nicht mal, daß die Spaltenwerte für die ungruppierten Spalten alle aus demselben Datensatz kommen ...

    [1]: "erste Zeile" gibt es in der Datenbank nicht, die Datensätze sind unsortiert - eine Sortierung kommt erst durch ORDER BY zustande.

    verwende ich es falsch? wie kann man die zeilen bei der ausgabe gruppieren?

    Ja. Und Du hast es auch falsch verstanden, weil Du glaubtest, es handele sich um eine Sortierung statt einer Gruppierung.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. yo,

      [1]: "erste Zeile" gibt es in der Datenbank nicht, die Datensätze sind unsortiert - eine Sortierung kommt erst durch ORDER BY zustande.

      wenn mich nicht alles täuscht meine ich mich zu erinnern, dass mysql bei einer gruppierung auch gleichzeitig sortiert.

      Ilja

      1. Hi Ilja,

        »» [1]: "erste Zeile" gibt es in der Datenbank nicht, die Datensätze sind unsortiert - eine Sortierung kommt erst durch ORDER BY zustande.

        wenn mich nicht alles täuscht meine ich mich zu erinnern, dass mysql bei einer gruppierung auch gleichzeitig sortiert.

        nur die Ergebniszeilen. Aus den nicht gruppierten Zeilen kann der MySQL-Server tatsächlich einen beliebigen Wert zurückgeben:

          
        mysql> CREATE TEMPORARY TABLE test.t1 (c1 CHAR(1), c2 CHAR(1));  
        Query OK, 0 rows affected (0.00 sec)  
          
        mysql> INSERT INTO test.t1 (c1, c2) VALUES ('b', 'z'),('b','y'),('a','z'),('a','y');  
        Query OK, 4 rows affected (0.00 sec)  
        Records: 4  Duplicates: 0  Warnings: 0  
          
        mysql> SELECT c1,c2 FROM test.t1 GROUP BY c1;  
        +------+------+  
        | c1   | c2   |  
        +------+------+  
        | a    | z    |  
        | b    | z    |  
        +------+------+  
        2 rows in set (0.00 sec)  
        
        

        die Sortierung kann man allerdings auch unterdrücken, indem man ORDER BY NULL angibt:

          
        mysql> SELECT c1,c2 FROM test.t1 GROUP BY c1 ORDER BY NULL;  
        +------+------+  
        | c1   | c2   |  
        +------+------+  
        | b    | z    |  
        | a    | z    |  
        +------+------+  
        2 rows in set (0.00 sec)  
        
        

        Gruß,
        Andreas.

        1. yo,

          nur die Ergebniszeilen. Aus den nicht gruppierten Zeilen kann der MySQL-Server tatsächlich einen beliebigen Wert zurückgeben

          nicht wirklich, mysql erlaubt nicht das ausgeben von nicht gruppierten spalten, die unterschiedliche werte aufweisen. es zeigt nur keine fehlermeldung an, wenn es doch der fall ist. insofern sind auch diese spalte "sortiert", weil sie immer den gleichen wert haben.

          Ilja