Использование подзапросов для отображения нескольких ответов, имеющих одинаковое значение - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу показать этот продукт, который имеет самый высокий приз (группа по производителю).Но если два продукта имеют один и тот же приз, SQL показывает мне один из них.

SELECT name, manufacturer, MAX(prize)
FROM products p
GROUP BY manufacturer
HAVING MAX(prize) = (SELECT MAX(p1.prize)
                  FROM products p1
                  WHERE p.manufacturer = p1.manufacturer
                  LIMIT 1
                 );

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Сначала выберите все группы максимальных призов по производителю и присоединитесь к основному столу:

select p.* from
(select manufacturer, MAX(prize) AS maxprize from products GROUP BY manufacturer) AS m
inner join products p
on m.manufacturer = p.manufacturer and m.maxprize = p.prize
order by p.manufacturer, p.name 

См. demo

0 голосов
/ 27 декабря 2018

Вы, похоже, хотите простой подзапрос - без агрегации во внешнем запросе:

SELECT p.*
FROM products p
WHERE p.prize = (SELECT MAX(p2.prize)
                 FROM products p2
                 WHERE p2.manufacturer = p.manufacturer
                );

Как уже упоминалось в предыдущем вопросе, вы используете GROUP BY неправильно.В SELECT есть неагрегированные столбцы, которых нет в GROUP BY.

. Вы используете агрегирование во внешнем запросе, поэтому вы получаете только одну строку для каждого производителя.

ВС точки зрения производительности, это часто самый быстрый метод - с правильными показателями.В этом случае правильный индекс на (manufacturer, prize).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...