sql >> Databasteknik >  >> RDS >> Mysql

MySQL-grupp efter och beställ efter

En enkel lösning är att slå in frågan i ett underval med ORDER-satsen first och tillämpa GROUP BY senare :

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

Detta liknar att använda join men ser mycket snyggare ut.

Att använda icke-aggregerade kolumner i en SELECT med en GROUP BY-sats är icke-standard. MySQL kommer i allmänhet att returnera värdena för den första raden den hittar och kassera resten. Eventuella ORDER BY-satser kommer endast att gälla för det returnerade kolumnvärdet, inte för de kasserade.

VIKTIG UPPDATERING Att välja icke-aggregerade kolumner brukade fungera i praktiken men man bör inte lita på det. Enligt MySQL-dokumentationen "Detta är användbart främst när alla värden i varje icke aggregerad kolumn som inte är namngivna i GROUP BY är desamma för varje grupp. Servern är fri att välja vilket värde som helst från varje grupp, så om de inte är samma, är de valda värdena obestämda ."

Från och med 5.7.5 ONLY_FULL_GROUP_BY är aktiverat som standard så icke-aggregerade kolumner orsakar frågefel (ER_WRONG_FIELD_WITH_GROUP)

Som @mikep påpekar nedan är lösningen att använda ANY_VALUE() från 5,7 och uppåt

Sehttp://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



  1. Varför skapar inte postgres databasen?

  2. Tablespace SYSMGMTDATA är FULL i Grid Infrastructure Management Repository (MGMTDB)

  3. PostgreSQL 11:Vad är nytt

  4. SQL:Välj Top 3 Records + Sum of Quantity