Rechercher dans le manuel MySQL

3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column

Task: For each article, find the dealer or dealers with the most expensive price.

This problem can be solved with a subquery like this one:

  1. SELECT article, dealer, price
  2. FROM   shop s1
  3. WHERE  price=(SELECT MAX(s2.price)
  4.               FROM shop s2
  5.               WHERE s1.article = s2.article)
  6. ORDER BY article;
  7.  
  8. +---------+--------+-------+
  9. | article | dealer | price |
  10. +---------+--------+-------+
  11. |    0001 | B      |  3.99 |
  12. |    0002 | A      | 10.99 |
  13. |    0003 | C      |  1.69 |
  14. |    0004 | D      | 19.95 |
  15. +---------+--------+-------+

The preceding example uses a correlated subquery, which can be inefficient (see Section 13.2.11.7, “Correlated Subqueries”). Other possibilities for solving the problem are to use an uncorrelated subquery in the FROM clause, a LEFT JOIN, or a common table expression with a window function.

Uncorrelated subquery:

  1. SELECT s1.article, dealer, s1.price
  2. FROM shop s1
  3.   SELECT article, MAX(price) AS price
  4.   FROM shop
  5.   GROUP BY article) AS s2
  6.   ON s1.article = s2.article AND s1.price = s2.price
  7. ORDER BY article;

LEFT JOIN:

  1. SELECT s1.article, s1.dealer, s1.price
  2. FROM shop s1
  3. LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
  4. WHERE s2.article IS NULL
  5. ORDER BY s1.article;

The LEFT JOIN works on the basis that when s1.price is at its maximum value, there is no s2.price with a greater value and thus the corresponding s2.article value is NULL. See Section 13.2.10.2, “JOIN Syntax”.

Common table expression with window function:

  1. WITH s1 AS (
  2.    SELECT article, dealer, price,
  3.           RANK() OVER (PARTITION BY article
  4.                            ORDER BY price DESC
  5.                       ) AS `Rank`
  6.      FROM shop
  7. )
  8. SELECT article, dealer, price
  9.   FROM s1
  10.   WHERE `Rank` = 1
  11. ORDER BY article;

Rechercher dans le manuel MySQL

Traduction non disponible

Le manuel MySQL n'est pas encore traduit en français sur l'infobrol. Seule la version anglaise est disponible pour l'instant.

Document créé le 26/06/2006, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/mysql-rf-example-maximum-column-group-row.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Références

  1. Consulter le document html Langue du document :en Manuel MySQL : https://dev.mysql.com/

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

Table des matières Haut