Xava: Voting DB-Abfrage?

Beitrag lesen

Hallo Ilja!

mysql schluckt solch konstrukte zwar, sollte es aber nicht. dieser "fehler" wird sehr oft gemacht,
aggregat-funktionen zusammen mit anderen spalten auszugeben, über die nicht gruppiert wurde. mysql
spielt da ein wenig mit dem feuer, aber meiner meinung nach mit mehr nachteilen als vorteilen.

Ich bin hier anderer Meinung: Es ist kein "Fehler". Man kann nur nicht verhersagen, welcher der Werte/Zeile zu angezeigt wird. Und hier ist in vielen Anwendungen Vorsicht geboten.

Folgendes Zitat aus dem MySQL-Handbuch:

MySQL hat die Benutzung von GROUP BY erweitert. Sie können Spalten
   oder Berechnungen im SELECT-Ausdruck angeben, die nicht im GROUP
   BY-Teil erscheinen. Das steht für jeden möglichen Wert für diese
   Gruppe. Das können Sie benutzen, um bessere Performance zu erzielen,
   indem Sie Sortieren und Gruppieren unnötiger Bestandteile vermeiden.
   Zum Beispiel müssen Sie in folgender Anfrage nicht nach kunde.name
gruppieren:

mysql> select bestellung.kunde_id,kunde.name,max(zahlungen)
          from bestellung,kunde
          where bestellung.kunde_id = kunde.kunde_id
          GROUP BY bestellung.kunde_id;

In ANSI-SQL müssten Sie der GROUP BY-Klausel kunde.name hinzufügen.
   In MySQL ist der Name überflüßig, solange Sie nicht im ANSI-Modus
fahren.

Benutzen Sie dieses Feature nicht, wenn die Spalten, die Sie im GROUP BY-Teil
   auslassen, in der Gruppe nicht eindeutig sind! Sonst erhalten
   Sie unvorhersagbare Ergebnisse.

(Quelle: http://dev.mysql.com/doc/mysql/de/Group_by_functions.html)

Somit haben wir beide ein stückweit Recht: Es ist in MySQL _kein_ Fehler, sondern ein Feature. Im ANSI-SQL jedoch muss -- wie oben beschreiben -- die anderen Spalten in die "GROUP BY" aufgeführt werden.

Bei anderen DBMS' bzw. bei ANSI-SQL funktioniert dies nur bei gleichen Werten in den Spalten, da sie ja mit ins "GROUP BY" müssen -- bei verschiedenen Werten würden dann auch verschiedene Zeilen ausgegeben werden.

Abzuraten ist diese zusätzliche Feature für Leute, die sich ein späteren Wechsel des DBMS' vorbehalten möchten. (Dies gilt für alle DBMS und deren zusätzlichen, nicht ANSI-SQL-komformen Befehlen)