Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mindestabstand und gruppieren nach

Hier ist ein ausgezeichneter Artikel in der offiziellen MySQL-Dokumentation:

Zitat:

Die Zeilen, die das gruppenweise Maximum einer bestimmten Spalte enthalten

Aufgabe:Finden Sie für jeden Artikel den oder die Händler mit dem teuersten Preis.

Dieses Problem kann mit einer Unterabfrage wie dieser gelöst werden:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);

Das vorherige Beispiel verwendet eine korrelierte Unterabfrage, die ineffizient sein kann (siehe Abschnitt 13.2.10.7, „Korrelierte Unterabfragen“). Andere Möglichkeiten zur Lösung des Problems sind die Verwendung einer unkorrelierten Unterabfrage in der FROM-Klausel oder eines LEFT JOIN.

Unkorrelierte Unterabfrage:

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;

LINKS VERBINDEN:

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;

Der LEFT JOIN funktioniert auf der Grundlage, dass es keinen s2.price mit einem größeren Wert gibt, wenn s1.price seinen maximalen Wert hat, und die s2-Zeilenwerte NULL sind.