Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Gruppieren nach und Sortieren nach

Eine einfache Lösung besteht darin, die Abfrage mit der ORDER-Anweisung first in eine Unterauswahl einzuschließen und das Anwenden von GROUP BY später :

SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)

Dies ähnelt der Verwendung des Joins, sieht aber viel schöner aus.

Die Verwendung von nicht aggregierten Spalten in einem SELECT mit einer GROUP BY-Klausel ist nicht standardmäßig. MySQL gibt im Allgemeinen die Werte der ersten gefundenen Zeile zurück und verwirft den Rest. Alle ORDER BY-Klauseln gelten nur für den zurückgegebenen Spaltenwert, nicht für die verworfenen.

WICHTIGE UPDATE Die Auswahl von nicht aggregierten Spalten hat in der Praxis funktioniert, sollte sich aber nicht darauf verlassen. Gemäß der MySQL-Dokumentation "Dies ist vor allem dann nützlich, wenn alle Werte in jeder nicht aggregierten Spalte, die nicht in GROUP BY benannt sind, für jede Gruppe gleich sind. Der Server kann jeden Wert frei wählen aus jeder Gruppe, so dass wenn sie nicht gleich sind, die gewählten Werte unbestimmt sind ."

Ab 5.7.5 ONLY_FULL_GROUP_BY ist standardmäßig aktiviert, sodass nicht aggregierte Spalten Abfragefehler verursachen (ER_WRONG_FIELD_WITH_GROUP)

Wie @mikep unten betont, besteht die Lösung darin, ANY_VALUE() ab 5.7 und höher

Siehe http://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc /refman/5.6/en/group-by-handling.html https://dev.mysql.com/doc /refman/5.7/en/group-by-handling.html https://dev.mysql.com /doc/refman/5.7/en/miscellaneous-functions.html#function_any-value