MYSQL, die Sortierung, nach group ist nicht mehr korrekt
Malli
- datenbank
1 Rouven
Ich möchte mir eine kleine Statistik augeben lassen.
Dazu frage ich einfach meine Tabelle ab:
SELECT id, datum FROM table ORDER by datum DESC
So bekomme ich alle Einträge sortiert nach Datum.
ID Datum
62 2014-04-17 17:55:10
62 2014-04-17 17:55:07
88 2014-04-17 17:55:02
59 2014-04-17 17:54:57
67 2014-04-17 17:54:54
62 2014-04-17 17:54:52
72 2014-04-17 17:54:49
10 2014-04-17 17:52:52
10 2014-04-17 17:49:39
Jetzt würde ich aber gerne eine ZUsammenfassung meiner Einträge ausgeben lassen, also nur immer eine ID, wenn mehrere Einträge in der Tabelle sind immer den neuesten. So groupiere ich alle IDs und lasse sie mir ausgeben:
SELECT id, datum FROM table GROUP BY id ORDER by datum DESC
ID Datum
88 2014-04-17 17:55:02
59 2014-04-17 17:54:57
67 2014-04-17 17:54:54
62 2014-04-17 17:54:52
72 2014-04-17 17:54:49
10 2014-04-17 17:49:39
Aber die Ausgabe, bzw. die sortierung stimmt nicht es werden alte, Einträge angezeigt, nicht die neusten. Wie kann ich aber die sortierung richtig hin bekommen?
Es müsste eigentlich
10 2014-04-17 17:52:52
angezeigt werden, es kommt aber
10 2014-04-17 17:49:39
Malli
Hello,
62 2014-04-17 17:55:10
62 2014-04-17 17:55:07
SELECT id, datum FROM table GROUP BY id ORDER by datum DESC
Es müsste eigentlich [..] angezeigt werden, es kommt aber
nach welcher Logik bist du der Meinung, dass das andere Ergebnis rauskommen sollte? Von der Abarbeitungsreihenfolge kommt dein "ORDER BY" erst NACH der Gruppierung zum Zuge, sprich auf dem Endergebnis, nicht auf den Rohdaten.
Ich bin ja erstaunt, dass nach 3 Jahren, in denen ich mich kaum mit Datenbanken beschäftigt habe, dieses verlockende Verhalten immer noch in MySQL enthalten ist.
Viele Datenbanksysteme würden dein Query mit einem Syntaxfehler ablehnen. Die Regel für "sauberes" SQL lautet:
Bei Verwendung von GROUP BY muss das Statement sicher stellen, dass eindeutig feststeht, wie die Spalten des Ergebnisses aussieht. Dies geschieht darüber, dass jede Spalte entweder in der GROUP BY Klausel angegeben ist, oder ihr Wert sich aus einer Aggregatfunktion (MAX, MIN, SUM, ..) berechnet. In deinem Fall ist das nicht so, weil zwei Datumswerte zur Auswahl stehen. Wenn du den neusten suchst, dann also den maximalen:
SELECT id, MAX(datum) AS max_date FROM table GROUP BY id ORDER BY max_date DESC
MfG
Rouven