Qui è un ottimo articolo nella documentazione ufficiale di MySQL:
Citazione:
Le righe che contengono il massimo in termini di gruppo di una determinata colonna
Compito:per ogni articolo, trova il rivenditore o i rivenditori con il prezzo più caro.
Questo problema può essere risolto con una sottoquery come questa:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
L'esempio precedente utilizza una sottoquery correlata, che può essere inefficiente (consultare Sezione 13.2.10.7, «Sottoquery correlate»). Altre possibilità per risolvere il problema sono utilizzare una sottoquery non correlata nella clausola FROM o un LEFT JOIN.
Subquery non correlata:
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;
UNISCI A SINISTRA:
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;
Il LEFT JOIN funziona sulla base del fatto che quando s1.price è al suo valore massimo, non c'è s2.price con un valore maggiore e i valori delle s2 righe saranno NULL.