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

MySQL-gruppe efter og bestil efter

En simpel løsning er at pakke forespørgslen ind i et undervalg med ORDER-sætningen first og anvendelse af GROUP BY senere :

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

Dette svarer til at bruge joinforbindelsen, men ser meget pænere ud.

Brug af ikke-aggregerede kolonner i en SELECT med en GROUP BY-sætning er ikke-standard. MySQL vil generelt returnere værdierne for den første række, den finder, og kassere resten. Eventuelle ORDER BY-klausuler gælder kun for den returnerede kolonneværdi, ikke for de kasserede.

VIGTIG OPDATERING Valg af ikke-aggregerede kolonner plejede at fungere i praksis, men man bør ikke stole på det. Ifølge MySQL-dokumentationen "Dette er primært nyttigt, når alle værdier i hver ikke-aggregerede kolonne, der ikke er navngivet i GROUP BY, er de samme for hver gruppe. Serveren kan frit vælge en hvilken som helst værdi fra hver gruppe, så medmindre de er ens, er de valgte værdier ubestemte ."

Fra 5.7.5 ONLY_FULL_GROUP_BY er aktiveret som standard, så ikke-aggregerede kolonner forårsager forespørgselsfejl (ER_WRONG_FIELD_WITH_GROUP)

Som @mikep påpeger nedenfor er løsningen at bruge ANY_VALUE() fra 5.7 og derover

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



  1. SQL Unik begrænsning på tværs af flere tabeller

  2. TO_YMINTERVAL() Funktion i Oracle

  3. Oracle dato til streng konvertering

  4. Rækketælling med BOB