#mysql #sql
#mysql #sql
Вопрос:
Я работаю с базой данных MySQL, где у меня есть таблицы. Таблица продуктов с уникальным продуктом и таблица цен, которая содержит несколько цен для каждого продукта.
Сегодня я использую следующий запрос, который вернет строки для стольких разных цен, присутствующих в таблице цен для каждого продукта:
SELECT product.id as id, price.unit_price as price
FROM product
INNER JOIN price
ON price.product_id=product.id
WHERE category_id = 234
Как я могу изменить этот запрос, чтобы возвращать только одну строку для каждого продукта с самой низкой ценой (price.unit_price), присутствующей в таблице цен, и возможно ли это только с одним запросом?
Комментарии:
1. Выполните ГРУППИРОВКУ ПО. Используйте MIN() .
Ответ №1:
Это, вероятно, самый простой способ:
SELECT product.id as id, min(price.unit_price) as price
FROM product
INNER JOIN price
ON price.product_id=product.id
WHERE category_id = 234
group by product.id
Комментарии:
1. Спасибо.. Сначала я пропустил ГРУППУ, которая возвращает только один результат, но теперь, похоже, она работает очень хорошо.. Спасибо за ответ .. все вы.
2. Стоит также рассмотреть ответ Гордона; оконные функции могут выглядеть немного сложнее, но они также более гибкие. Например, если вы добавили третий столбец позже, вам нужно будет добавить его в группу по или также объединить его.
Ответ №2:
Простой метод использует оконные функции:
SELECT p.id as id, pr.unit_price as price
FROM product p INNER JOIN
(SELECT pr.*,
ROW_NUMBER() OVER (PARTITION BY pr.product_id ORDER BY pr.unit_price DESC) as seqnum
FROM price pr
) pr
ON pr.product_id = p.id AND seqnum = 1
WHERE p.category_id = 234;
Это позволяет вам добавлять дополнительные столбцы из любой таблицы. В противном случае просто используйте агрегацию:
SELECT p.id as id, MIN(pr.unit_price) as price
FROM product p INNER JOIN
price pr
ON pr.product_id = p.id
WHERE p.category_id = 234;