Spec-Zone .ru
спецификации, руководства, описания, API

3.6.4. Строки, Содержащие Мудрый группой Максимум Определенного Столбца

Задача: Для каждой статьи найдите дилера или дилеров с самой дорогой ценой.

Эта проблема может быть решена с подзапросом как этот:

SELECT article, dealer, priceFROM   shop s1WHERE  price=(SELECT MAX(s2.price)              FROM shop s2              WHERE s1.article = s2.article);+---------+--------+-------+| article | dealer | price |+---------+--------+-------+|    0001 | B      |  3.99 ||    0002 | A      | 10.99 ||    0003 | C      |  1.69 ||    0004 | D      | 19.95 |+---------+--------+-------+

Предыдущий пример использует связанный подзапрос, который может быть неэффективным (см. Раздел 13.2.10.7, "Связанные подзапросы"). Другие возможности для того, чтобы решить проблему состоят в том, чтобы использовать несвязанный подзапрос в FROM пункт или a LEFT JOIN.

Несвязанный подзапрос:

SELECT s1.article, dealer, s1.priceFROM shop s1JOIN (  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.priceFROM shop s1LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.priceWHERE s2.article IS NULL;

LEFT JOIN работы на основе это, когда s1.price в его максимальном значении, есть нет s2.price с большим значением и s2 значения строк будут NULL. См. Раздел 13.2.9.2,"JOIN Синтаксис".