Mysql
 sql >> Base de données >  >> RDS >> Mysql

Regrouper MySQL par et trier par

Une solution simple consiste à envelopper la requête dans une sous-sélection avec l'instruction ORDER première et appliquer le GROUP BY plus tard :

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

Ceci est similaire à l'utilisation de la jointure, mais semble beaucoup plus agréable.

L'utilisation de colonnes non agrégées dans un SELECT avec une clause GROUP BY n'est pas standard. MySQL renverra généralement les valeurs de la première ligne qu'il trouve et supprimera le reste. Toutes les clauses ORDER BY ne s'appliqueront qu'à la valeur de colonne renvoyée, pas à celles supprimées.

MISE À JOUR IMPORTANTE La sélection de colonnes non agrégées fonctionnait dans la pratique, mais ne doit pas être invoquée. Selon la documentation MySQL "Ceci est utile principalement lorsque toutes les valeurs de chaque colonne non agrégée non nommée dans GROUP BY sont les mêmes pour chaque groupe. Le serveur est libre de choisir n'importe quelle valeur de chaque groupe, donc sauf si elles sont identiques, les valeurs choisies sont indéterminées ."

Depuis 5.7.5 ONLY_FULL_GROUP_BY est activé par défaut afin que les colonnes non agrégées provoquent des erreurs de requête (ER_WRONG_FIELD_WITH_GROUP)

Comme @mikep le souligne ci-dessous, la solution consiste à utiliser ANY_VALUE() à partir de 5.7 et plus

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