sql order by with group by子句

oxcyiej7  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(345)

我有一个stock表,它包含产品id、公司id、大小id和价格的外键。我需要取得总公司,产品名称(升序),价格和数量(最低价格只)-为每一个产品。
我试过了,

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;

到目前为止,每种产品的尺寸和价格都是随机的。如果我在selectquery中输入min(stock.price),那么price是正确的,但是关联的大小是错误的。如果我将条件设置为只选择价格最低的产品,那么公司计数将减少到1。
任何帮助或指点都非常感谢。

wr98u20j

wr98u20j1#

在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字节。如果这不够大,那么可以将缓冲区变大。

rbpvctlc

rbpvctlc2#

基于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

相关问题