MySQL查询为何SELECT子句的列需要再次包含在GROUP BY子句中
MySQL GROUP BY 报错原因说明
1. 要求id放入GROUP BY的核心规则
MySQL 5.7及以上版本默认开启ONLY_FULL_GROUP_BY SQL模式,符合标准SQL的分组约束:
- 当使用GROUP BY执行分组查询时,SELECT子句中仅允许出现两类内容:GROUP BY子句中指定的分组列、使用聚合函数(如
COUNT()、SUM()、MAX()、GROUP_CONCAT()等)计算的结果列。 - 你的查询中SELECT里的
id、player_name属于非分组列、也没有被聚合函数包裹,按身高范围分组后每个分组对应多条球员记录,数据库无法确定要返回该分组下的哪一条记录的id和姓名,因此触发报错。 - 该报错和你使用派生列
height_range分组没有关联,是SELECT子句的内容不符合分组规则导致的。
2. MySQL支持按派生列/SELECT别名分组
你无需怀疑height_range作为分组条件的合法性:MySQL对SQL标准做了扩展,允许GROUP BY子句直接引用SELECT阶段定义的别名,不需要重复写整个CASE表达式。
正确写法参考
如果你的需求是统计每个身高区间的相关指标,可将SELECT中的单列替换为聚合函数:
SELECT CASE WHEN height <= 50 THEN '0-50' WHEN height BETWEEN 50 AND 70 THEN '51-70' WHEN height BETWEEN 71 AND 80 THEN '71-80' ELSE '80+' END AS height_range, COUNT(*) AS total_players, -- 统计区间内总人数 GROUP_CONCAT(player_name) AS player_list -- 可选:拼接区间内所有球员姓名 FROM benn.college_football_players GROUP BY height_range ORDER BY height_range DESC
如果你的需求只是将所有球员按身高区间排序展示,不需要做聚合统计,去掉GROUP BY子句,直接按height_range排序即可。
内容的提问来源于stack exchange,提问作者Aparna
相关产品推荐
相关产品推荐

