Mysql
 sql >> Database >  >> RDS >> Mysql

Distanza minima e raggruppamento per

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.