sql >> Database >  >> RDS >> Mysql

Minimale afstand en groeperen op

Hier is een uitstekend artikel in de officiële MySQL-documentatie:

Citaat:

De rijen die het groepsgewijze maximum van een bepaalde kolom bevatten

Taak:zoek voor elk artikel de dealer of dealers met de duurste prijs.

Dit probleem kan worden opgelost met een subquery zoals deze:

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

In het voorgaande voorbeeld wordt een gecorreleerde subquery gebruikt, die inefficiënt kan zijn (zie Paragraaf 13.2.10.7, "Gecorreleerde subquery's"). Andere mogelijkheden om het probleem op te lossen zijn het gebruik van een niet-gecorreleerde subquery in de FROM-component of een LEFT JOIN.

Niet-gecorreleerde subquery:

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;

LEFT JOIN:

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;

De LEFT JOIN werkt op basis van het feit dat wanneer s1.price de maximale waarde heeft, er geen s2.price is met een hogere waarde en dat de waarden van de s2 rijen NULL zijn.



  1. Algemene fout:1615 Voorbereide instructie moet opnieuw worden voorbereid

  2. PSQL-opdrachtregelargumenten in DO-script

  3. Een alias van een database maken in SQL Server

  4. MySql-statement voorbereiden - is het mogelijk om de kolomnaam of functienaam te parametreren?