MySQL查询单次订单销量最高的3款产品(产品名+订单号)问题
解决单次订单中销量最高3款产品的查询问题
原SQL的问题
你写的SQL错误在于:
- 按
ProductName分组后,SUM(Quantity)计算的是某款产品在所有订单中的总销量,不是单次订单里的单款产品销量,完全不符合需求。 - 分组时只指定了
ProductName,但OrderID不在分组字段里,这在MySQL严格模式下会直接报错,返回的结果也不具备参考性。
正确的查询语句
方式1:直接取销量最高的前3条(不处理并列)
这个写法简单直接,适合只需要Top3的场景:
SELECT Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity AS 单次订单销量 FROM Products INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID ORDER BY OrderDetails.Quantity DESC LIMIT 3;
方式2:包含并列排名的Top3(推荐处理并列情况)
如果存在多个产品销量和第三名相同,用窗口函数可以把这些并列的产品都列出来:
SELECT ProductName, OrderID, 单次订单销量 FROM ( SELECT p.ProductName, od.OrderID, od.Quantity AS 单次订单销量, RANK() OVER (ORDER BY od.Quantity DESC) AS 排名 FROM Products p INNER JOIN OrderDetails od ON p.ProductID = od.ProductID ) AS 排名结果 WHERE 排名 <= 3;
说明
OrderDetails表中的Quantity字段本身就是单次订单中对应产品的销量,不需要用SUM()聚合,因为每条OrderDetails记录对应一个订单里的一款产品的购买数量。- 两种写法都通过
INNER JOIN关联Products表获取产品名称,确保结果包含你需要的字段。
内容的提问来源于stack exchange,提问作者barry023
相关产品推荐
相关产品推荐

