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

mysql :select max(score) ne renvoie pas les données de ligne pertinentes

Vous utilisez MAX , qui est une fonction d'agrégation. Les fonctions d'agrégation ont pour effet de traiter plusieurs lignes du tableau comme un groupe. Si vous ne faites rien de spécial, toutes les lignes de la table entière seront utilisées comme un seul grand groupe, et lorsqu'une fonction d'agrégation comme MAX est là, toutes ces lignes seront condensées en une seule ligne agrégée. Cet effet de condensation se serait également produit pour d'autres fonctions d'agrégation comme MIN , SUM , GROUP_CONCAT et amis (voir :http://dev. mysql.com/doc/refman/5.1/en/group-by-functions.html ). Vous pouvez également appliquer des regroupements spécifiques en utilisant le GROUP BY construire, mais si vous ne le faites pas, l'occurrence de la fonction d'agrégation ne fera que regrouper toutes les lignes en une seule ligne (mais ce regroupement se produit après l'application du WHERE condition, de sorte que seules les lignes filtrées sont agrégées)

Maintenant, à cause de cet effet de condensation ou de "réduction" des fonctions d'agrégation, il existe un moyen de faire une valeur à partir de plusieurs valeurs. Pour MAX , cette méthode consiste à répertorier uniquement la valeur maximale trouvée pour toutes les instances de l'expression que vous avez passées en argument à MAX . Mais vos autres colonnes n'ont pas une telle fonction d'agrégation. Pour la plupart des produits de base de données, l'occurrence de colonnes non agrégées et agrégées dans le SELECT liste serait une erreur. Mais MySQL se comporte mal/différemment et renvoie une seule des valeurs disponibles pour chaque expression non agrégée répertoriée dans le SELECT bit. Quelle valeur dépend de mysql - vous ne pouvez pas vous fier à un algorithme particulier.

Dans de nombreux cas, les gens veulent faire quelque chose avec "n'importe quelle ligne qui a la valeur maximale", en d'autres termes, trouver la ligne qui a comme valeur la valeur maximale, mais utiliser les autres colonnes de cette ligne non agrégées. La solution fournie par middaparka le fait, et il existe d'autres moyens d'y parvenir également (google for MySQL group-wise maximum). Pour plus d'informations générales sur les fonctions d'agrégation et le GROUP BY associé clause, vous pouvez jeter un oeil à -shameless selfplug- mon article ici :http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html