SELECT字段未在GROUP BY中报错原因咨询(sql_mode=only_full_group_by)
关于
only_full_group_by模式下GROUP BY的报错原因 问题场景
执行一条包含JOIN和GROUP BY的SQL查询时触发报错,报错信息如下:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ipay_app.sp.code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原查询语句:
select sp.code,count(sps.sp_key) from service_providers sp left join service_providers_sub sps on sp.code = sps.sp_key group by sps.sp_key;
将sp.code添加到GROUP BY子句后查询正常得到结果,以下是报错原因的说明:
报错核心原因
MySQL的only_full_group_by是严格SQL规范的强制要求,它规定SELECT列表里的所有非聚合字段必须满足两个条件之一:
- 直接出现在GROUP BY子句中,作为分组的依据
- 在功能上依赖于GROUP BY里的字段(比如是分组字段的主键/唯一键,能被分组字段唯一确定)
回到你的查询:
GROUP BY的是sps.sp_key,但SELECT里的sp.code既不在GROUP BY里,也无法被sps.sp_key唯一确定——因为是左连接,一个sps.sp_key可能对应多个sp.code(或者当sps里无匹配数据时,sps.sp_key为NULL,对应多个sp.code),数据库无法确定该返回哪一个sp.code值,因此直接抛出报错。
解决逻辑验证
当你把sp.code加入GROUP BY后,分组依据变成sps.sp_key+sp.code,此时SELECT里的sp.code属于分组字段,完全符合only_full_group_by的要求,数据库能明确每个分组对应的sp.code值,因此可以正常执行查询。
内容的提问来源于stack exchange,提问作者Rohannn Singh
相关产品推荐
相关产品推荐

