MySQL 分组联查 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column... 报错问题解决
在捣鼓 MySQL左联多个表做分组查询数据重复问题解决 时,遇到了报错:
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.base.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.001000s
百度翻译:
1055 - SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列 “test.base.id”,该列在功能上不依赖于 GROUP BY 子句的列;这与 sql_mode=only_full_group_by 不兼容,时间:0.001000s这里提取到一个关键词 ONLY_FULL_GROUP_BY SQL 模式。网上转了一圈,大概的情况就是,MySQL 5.7 开始默认开启 ONLY_FULL_GROUP_BY 模式,查询时会做这样的检查:select 后面查询的字段有没有出现在 group by 中。也提供了几种解决方法:
- 修改 sql 使其遵守 only_full_group_by 规则
- 关闭 only_full_group_by 规则
- 将 MySql 的版本降到 5.7 以下
mysql -V 查到本地 docker 安装的 MySQL 服务器版本为 5.7.36。show variables like '%sql_mode%'; 查到 sql_mode 的值里也确实有 ONLY_FULL_GROUP_BY。
首先降低 MySQL 版本不推荐,其次也不推荐关闭 only_full_group_by 规则,这是没有办法解决的时候的办法。
参考教程里有提到两种修改 sql 使其遵守或者规避规则的方法:
- 在 group by 后面追加上 select 的列
- 使用子查询或先分组再联查的方式规避规则
本来已经准备按照这两种方式改了,突然发现,我的情况不太一样。我的是主表关联字段不是主键,但起到主键的作用,并且还创建了 unique 的索引。将 GROUP BY 的对象改为主键,然后不报错了。
SELECT `base`.*,
SUM(user_operation2.num) AS operation2_num,
SUM(user_operation2.money) AS operation2_money
FROM base
LEFT JOIN user_operation2 ON user_operation2.user_id = base.user_id
GROUP BY base.user_id
LIMIT 0 ,10之后测试发现,将主表关联字段设置为非 null 之后,报错也消失了。
参考教程:
真正有效解决 ONLY_FULL_GROUP_BY 的问题
MySql 报错 only_full_group_by 的解决办法
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
海滨擎蟹
微信
支付宝