MySQL 8中GROUP BY查询报错求助(旧版本查询正常)
这个问题源于MySQL 8默认启用了only_full_group_by SQL模式——它严格遵循SQL标准,要求SELECT列表中的非聚合列必须要么出现在GROUP BY子句中,要么与GROUP BY中的列存在函数依赖关系(即被GROUP BY的列唯一确定)。你的旧查询里business_name和city不在GROUP BY范围内,且MySQL 8无法自动识别它们被business_id, business_location_id唯一确定,因此触发报错。
下面是几种可行的解决方案:
方案1:修改GROUP BY子句(推荐,符合SQL标准)
把SELECT里的非聚合列business_name和city添加到GROUP BY中,从你的数据来看,同一组(相同business_id+business_location_id)对应的这两个值完全一致,修改后查询结果和旧版本完全相同,同时符合MySQL 8的严格要求:
SELECT business_name, city, SUM(lot_count) as lot_count, SUM(lot_sold) as lot_sold FROM table_1 GROUP BY business_id, business_location_id, business_name, city;
方案2:临时关闭only_full_group_by模式(仅临时测试用,不推荐)
如果只是临时需要兼容旧代码、不想修改查询,可以临时关闭这个模式,但这会让MySQL回到旧的宽松行为,可能导致非预期的分组结果(比如同一组内非聚合列有不同值时,返回结果随机):
-- 仅修改当前会话的sql_mode,重启或新开会话后失效 SET SESSION sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''); -- 执行原查询即可 SELECT business_name, city, SUM(lot_count) as lot_count, SUM(lot_sold) as lot_sold FROM table_1 GROUP BY business_id, business_location_id;
方案3:添加唯一索引让MySQL识别函数依赖
从你的数据看,business_id和business_location_id的组合是唯一的,给这两个列添加唯一索引后,MySQL会自动识别business_name和city依赖于这两个列,此时原查询无需修改就能正常执行:
ALTER TABLE table_1 ADD UNIQUE INDEX idx_business_loc (business_id, business_location_id);
补充:旧版本为什么能执行?
旧版本MySQL默认未启用only_full_group_by,会采用宽松的分组策略:当SELECT里的非聚合列不在GROUP BY时,会随机选择该组中的一个值返回。虽然看起来能运行,但存在潜在的不确定性(如果同一组内非聚合列有不同值,返回结果不可控),MySQL 8启用严格模式正是为了避免这种数据一致性问题。
内容的提问来源于stack exchange,提问作者jay sahu

