Maison >base de données >tutoriel mysql >Comment puis-je récupérer correctement des colonnes non agrégées avec MAX() et GROUP BY de MySQL ?

Comment puis-je récupérer correctement des colonnes non agrégées avec MAX() et GROUP BY de MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-30 21:27:09897parcourir

How Can I Correctly Retrieve Non-Aggregated Columns with MySQL's MAX() and GROUP BY?

Regroupement et agrégation avec MAX() dans MySQL

Dans MySQL, la fonction MAX() peut être utilisée en conjonction avec GROUP BY pour agréger les données et sélectionner la valeur maximale pour une colonne spécifiée dans chaque groupe. Cependant, si la colonne cible n'est pas unique au sein d'un groupe, la sélection des colonnes non agrégées correspondantes peut donner des résultats inattendus.

Pour illustrer ce problème, examinons la requête SQL suivante :

SELECT MAX(timestamp), rid, pid
FROM theTable
GROUP BY rid;

Les résultats de cette requête peuvent ne pas correspondre au résultat souhaité, car la colonne pid sélectionnée peut ne pas correspondre à l'horodatage avec la valeur maximale.

Pour obtenir les résultats corrects, nous devons modifier la requête pour identifier les lignes avec le maximum d'horodatages au sein de chaque groupe, puis joindre ces lignes à la table d'origine pour obtenir les pids correspondants.

La requête SQL modifiée suivante accomplit cela :

SELECT test.pid, test.cost, test.timestamp, test.rid
FROM theTable AS test
INNER JOIN
    (SELECT rid, MAX(timestamp) AS ts
    FROM theTable
    GROUP BY rid) AS maxt
ON (test.rid = maxt.rid AND test.timestamp = maxt.ts);

Cette requête identifie d'abord l'horodatage maximum pour chaque débarras à l'aide d'une sous-requête, puis la joint à la table d'origine. La condition de jointure garantit que les lignes sélectionnées sont celles avec le maximum d'horodatages au sein de chaque groupe rid.

En conséquence, le résultat souhaité est obtenu :

pid cost timestamp rid
5 345 2011-04-14 01:06:06 1
3 4455 2011-04-14 01:05:41 2
7 5435 2011-04-14 01:14:14 3

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn