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;

Suchen Sie im MySQL-Handbuch

Deutsche Übersetzung

Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.

Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.

Vielen Dank im Voraus.

Dokument erstellt 26/06/2006, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/mysql-rf-example-maximum-column-group-row.html

Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.

Referenzen

  1. Zeigen Sie - html-Dokument Sprache des Dokuments:en Manuel MySQL : https://dev.mysql.com/

Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.

Inhaltsverzeichnis Haut