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 ?
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!