SQL排序依据与group by子句

时间:2018-08-25 11:25:07

标签: mysql sql

我有一个库存表,其中包含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 :(得分:0)

在V8之前的MySQL中这有点棘手。一种方法是使用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个字节。如果还不够大,则可以增大缓冲区。

答案 1 :(得分:0)

基于OP的注释,使用嵌套查询:

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