Как работает Group By аггрегатная функция и Having во вложенном запросе?

Рейтинг: 0Ответов: 1Опубликовано: 01.08.2023

Не понимаю почему вложенный запрос возвращает 4 строки, когда по логике должен был вернуть 3. Есть таблица с товарами, ключевые поля цена и категория.

Если выделить внутренний запрос и выполнить самостоятельно, вернется ожидаемо 3 строки - запрашивается данные из таблицы , они (1) сгруппированны и (2) отфильтрованны хавнгом. Вот внутренни запрос:

SELECT max(`buyPrice`) `max_bp` 
from `products`
GROUP BY `category` HAVING `max_bp` > 999

введите сюда описание изображения

Тепрь полный запрос, у которого внутри тот, что выше:

SELECT * 
FROM `products`
WHERE `buyPrice` IN (
    SELECT max(`buyPrice`) `max_bp` 
    from `products` AS `p`
    WHERE `products`.`buyPrice` = `p`.`buyPrice`
    GROUP BY `category` HAVING `max_bp` > 999
)

И вот это вложенный вернет почему-то 4 строки.

введите сюда описание изображения

Такое впечатление, что внутренний GROUP BY перестает работать. Ведь WHERE buyPrice IN получив 3 строки должен бы просто расширить таблицу. Не прошу исправить его, а лишь пояснить как это работает?

Вся таблица и запросы тут sqlfiddle.com

Ответы

▲ 0Принят

А может быть вот так тогда:

SELECT * 
FROM `products`,
(
    SELECT max(`buyPrice`) `max_bp`, `category` 
    from `products` AS `p`
    GROUP BY `category` HAVING `max_bp` > 999
) `m`
WHERE `products`.`buyPrice` = `m`.`max_bp` AND
      `products`.`category` = `m`.`category`

А почему возвращает 4 строки вам объяснили в комментарии. Фактически в вашем запросе группировка происходит с учётом WHERE, то есть группируются между собой только записи с той же buyPrice, что и в каждой строке основной таблицы. Таким образом, максимум по категории на самом деле не ищется из-за WHERE в запросе с группировкой. Максимум в этом случае оказывается равен цене каждого конкретного товара в products.