Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Raggruppa per e ordina per

Una soluzione semplice consiste nel racchiudere la query in una sottoselezione con l'istruzione ORDER first e applicando il GROUP BY più tardi :

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

È simile all'utilizzo del join ma sembra molto più bello.

L'utilizzo di colonne non aggregate in un SELECT con una clausola GROUP BY non è standard. MySQL generalmente restituirà i valori della prima riga che trova e scarterà il resto. Eventuali clausole ORDER BY si applicheranno solo al valore della colonna restituito, non a quelle scartate.

AGGIORNAMENTO IMPORTANTE La selezione di colonne non aggregate funzionava in pratica ma non dovrebbe essere utilizzata. Secondo la documentazione MySQL "questo è utile principalmente quando tutti i valori in ogni colonna non aggregata non nominata in GROUP BY sono gli stessi per ogni gruppo. Il server è libero di scegliere qualsiasi valore da ogni gruppo, quindi a meno che non siano gli stessi, i valori scelti sono indeterminati ."

A partire da 5.7.5 ONLY_FULL_GROUP_BY è abilitato per impostazione predefinita, quindi le colonne non aggregate causano errori di query (ER_WRONG_FIELD_WITH_GROUP)

Come sottolinea @mikep di seguito, la soluzione consiste nell'usare QUALSIASI_VALORE() da 5.7 e superiori

Vedihttp://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/funzioni-varie.html#function_any-value