Сортируем а затем групируем

Хочется поделиться интересной задачей на сообразительность, обычно я ее задаю на собеседовании. Задача интересна тем, что оказывается многие разработчики не знают, что выполняется раньше GROUP BY или ORDER BY. 

Итак, имеем такую таблицу:

name (имя автомобиля) price (цена) seller (продавец автомобиля)
bmw 20 1
bmw 10 2
audi 30 2

Задача: получить уникальный список автомобилей, минимальную цену по каждому авто и продавца который продает по этой цене (любого продавца если несколько продавцов продают автомобиль по одинаковой цене), чтобы было понятней, вот ожидаемый результат:

name (имя автомобиля) price (цена) seller (продавец автомобиля)
bmw 10 2
audi 30 2

Простое решение 

SELECT t.name, t.price, MIN(t.seller)
FROM t
INNER JOIN (
    SELECT name, MIN (price) as min_price FROM t GROUP BY name
) t2 ON t2.name = t.name AND t2.min_price = t. price
GROUP BY t.name, t.price

думаю все понятно, но если нужны пояснения, пишите.

Немного сложнее

SELECT t.name, t.price, MIN(t.seller)
FROM t
LEFT JOIN t AS t2 ON t2.name = t.name AND t2.price < t.price
WHERE t2.price IS NULL
GROUP BY t.name, t.price

поясню: сначала мы нашли строки товаров, у которых t2.price будет равен NULL, потому что подумайте логически, ведь при джоине образуется такая price меньше которой быть не может, вот в этих строках и возникает NULL. Данный пример для сортировки ASC, а для сортировки DESC просто поменяйте знак меньше на больше.

DISTINCT vs GROUP BY

Оказывается про это тоже забывают, поэтому сразу ответ: по сути это одно и тоже, но GROUP BY дает возможность использовать HAVING:

SELECT seller FROM t GROUP BY seller HAVING COUNT(*) > 1

а вот дополнительно отфильтровать с помощью DISTINCT не выйдет.

Более подробно про GROUP BY: 1 - 2

Оцени публикацию:
  • 5,24
Оценили: 5
Теги : mysql, group by, sort, нюансы

Предложения и пожелания:

 

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2020 YaPro.Ru

Лебеденко Николай Николаевич
Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter