Запрос выбора, возвращающий только один результат для каждого продукта?

#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;