SQL Сортировать с помощью group by - PullRequest
0 голосов
/ 25 августа 2018

У меня есть одна таблица запасов, которая содержит внешний ключ product_id, company_id, size_id и price. Мне нужно получить общее количество компаний, название продукта (в порядке возрастания), цену и объем (только для наименьшей цены) - для каждого продукта.

Я пытался,

SELECT pr.product_name, 
       COUNT(DISTINCT stock.company_id) AS total_companies, 
       sz.size_name, 
       stock.price 
FROM stock 
JOIN product pr ON pr.id = stock.product_id 
JOIN size sz ON sz.id = stock.size_id 
GROUP BY stock.product_id 
ORDER BY pr.product_name ASC;

Пока что здесь размер и цена являются случайными для каждого продукта. Если я выберу MIN (stock.price) в запросе выбора, тогда цена будет правильной, но тогда связанный размер будет неправильным. Если я поставлю условие, чтобы выбрать только продукты с минимальной ценой, то количество компаний уменьшится до 1.

Любая помощь или указатели очень ценятся.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

На основе комментариев ОП с использованием вложенных запросов:

SELECT inner_nest.* 
FROM (
      SELECT pr.product_name, 
             COUNT(DISTINCT stock.company_id) AS total_companies, 
             sz.size_name, 
             stock.price 
      FROM stock 
      JOIN product pr ON pr.id = stock.product_id 
      JOIN size sz ON sz.id = stock.size_id 
      GROUP BY stock.product_id 
      ORDER BY stock.price ASC 
     ) AS inner_nest
LIMIT 0, 1
0 голосов
/ 25 августа 2018

Это немного сложно в MySQL до V8. Один из способов - использовать трюк group_concat() / substring_index():

SELECT pr.product_name, 
       COUNT(DISTINCT s.company_id) AS total_companies, 
       SUBSTRING_INDEX(GROUP_CONCAT(sz.size_name ORDER BY s.price), ',', 1) as size_at_min_price
       MIN(s.price) as min_price
FROM stock s JOIN
     product pr
     ON pr.id = s.product_id JOIN
     size sz
     ON sz.id = s.size_id 
GROUP BY s.product_id 
ORDER BY pr.product_name ASC;

Примечания:

  • Предполагается, что размеры не содержат запятую.
  • Если у вас есть запятые в размерах, это легко сделать с помощью другого разделителя.
  • GROUP_CONCAT() по умолчанию ограничено 1024 байтами. Если этого недостаточно, вы можете увеличить размер буфера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...