MySQL查询Top5热销产品报错1055,求解决方法
问题分析与解决
错误信息翻译
错误代码:1055。SELECT列表中的第2个表达式不在GROUP BY子句中,并且包含非聚合列'ims.producttb.ProductID',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容
报错原因
MySQL默认开启的only_full_group_by严格模式要求:SELECT语句中的非聚合列(未被SUM、COUNT等聚合函数包裹的字段)必须要么出现在GROUP BY子句中,要么与GROUP BY子句中的列存在函数依赖关系(比如主键与所属表其他字段的一一对应关系)。
你的查询仅按ProductName分组,但ProductID既不在GROUP BY里,MySQL无法确认它和ProductName是一一对应的(比如可能存在不同ID但名称相同的产品),因此触发错误。
解决方案
提供两种可行的修改方式:
方式一:将ProductID加入GROUP BY子句
直接把需要SELECT的非聚合列都加到GROUP BY里,符合严格模式要求:
SELECT producttb.ProductName, producttb.ProductID, SUM(ordertb.Qty) AS Q FROM ordertb INNER JOIN producttb ON ordertb.ProductID = producttb.ProductID WHERE ordertb.OrderDate BETWEEN '2022-11-30' AND '2023-01-18' GROUP BY producttb.ProductName, producttb.ProductID ORDER BY Q DESC LIMIT 5;
方式二:按ProductID分组(更高效)
因为ProductID是产品表的主键,ProductName必然与它一一对应,按主键分组既符合严格模式要求,性能也更优:
SELECT producttb.ProductName, producttb.ProductID, SUM(ordertb.Qty) AS Q FROM ordertb INNER JOIN producttb ON ordertb.ProductID = producttb.ProductID WHERE ordertb.OrderDate BETWEEN '2022-11-30' AND '2023-01-18' GROUP BY producttb.ProductID ORDER BY Q DESC LIMIT 5;
内容的提问来源于stack exchange,提问作者xeyon
相关产品推荐
相关产品推荐

