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;

Zoek in de MySQL-handleiding

Nederlandse vertaling

U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.

Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.

Bij voorbaat dank.

Document heeft de 26/06/2006 gemaakt, de laatste keer de 26/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/mysql-rf-example-maximum-column-group-row.html

De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.

Referenties

  1. Bekijk - html-document Taal van het document:en Manuel MySQL : https://dev.mysql.com/

Deze verwijzingen en links verwijzen naar documenten die geraadpleegd zijn tijdens het schrijven van deze pagina, of die aanvullende informatie kunnen geven, maar de auteurs van deze bronnen kunnen niet verantwoordelijk worden gehouden voor de inhoud van deze pagina.
De auteur Deze site is als enige verantwoordelijk voor de manier waarop de verschillende concepten, en de vrijheden die met de referentiewerken worden genomen, hier worden gepresenteerd. Vergeet niet dat u meerdere broninformatie moet doorgeven om het risico op fouten te verkleinen.

Inhoudsopgave Haut