sql >> Databáze >  >> RDS >> Mysql

MySQL seskupit podle a seřadit podle

Jednoduchým řešením je zabalit dotaz do podvýběru pomocí příkazu ORDER first a použití GROUP BY později :

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

Je to podobné jako při použití spojení, ale vypadá to mnohem lépe.

Použití neagregovaných sloupců v SELECT s klauzulí GROUP BY je nestandardní. MySQL obecně vrátí hodnoty prvního řádku, který najde, a zbytek zahodí. Jakékoli klauzule ORDER BY se budou vztahovat pouze na vrácenou hodnotu sloupce, nikoli na vyřazené.

DŮLEŽITÉ AKTUALIZACE Výběr neagregovaných sloupců v praxi fungoval, ale nemělo by se na něj spoléhat. Podle dokumentace MySQL "toto je užitečné především tehdy, když jsou všechny hodnoty v každém neagregovaném sloupci, který není pojmenován v GROUP BY, pro každou skupinu stejné. Server si může svobodně vybrat libovolnou hodnotu z každé skupiny, takže pokud nejsou stejné, jsou zvolené hodnoty neurčité ."

Ke dni 5.7.5 ONLY_FULL_GROUP_BY je ve výchozím nastavení povolena, takže neagregované sloupce způsobují chyby dotazu (ER_WRONG_FIELD_WITH_GROUP)

Jak uvádí @mikep níže, řešením je použít ANY_VALUE() od 5.7 a výše

Vizhttp://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/cs/miscellaneous-functions.html#function_any-value



  1. Jak vytvořit bezpečný příkaz připravený mysql v php?

  2. Přidat ID automatického přírůstku do stávající tabulky?

  3. načíst vícenásobné sloupce seskupit podle data intervall

  4. LOAD DATA LOCAL INFILE zobrazuje chybu Použitý příkaz není u této verze MySQL povolen