Mysql
 sql >> Base de données >  >> RDS >> Mysql

Distance minimale et grouper par

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.