Ici est un excellent article dans la documentation officielle de MySQL :
Citation :
Les lignes contenant le maximum par groupe d'une certaine colonne
Tâche :Pour chaque article, trouvez le ou les revendeurs avec le prix le plus cher.
Ce problème peut être résolu avec une sous-requête comme celle-ci :
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
L'exemple précédent utilise une sous-requête corrélée, qui peut être inefficace (voir Section 13.2.10.7, « Sous-requêtes corrélées »). D'autres possibilités pour résoudre le problème consistent à utiliser une sous-requête non corrélée dans la clause FROM ou un LEFT JOIN.
Sous-requête non corrélée :
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price;
JOINTURE GAUCHE :
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;
Le LEFT JOIN fonctionne sur la base que lorsque s1.price est à sa valeur maximale, il n'y a pas de s2.price avec une valeur supérieure et les valeurs des lignes s2 seront NULL.