本文源自于这个报错:
MySQL> SELECT id, name FROM t1 GROUP BY name;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t1.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
查阅相关资料:
从官网手册来看,MySQL5.7.5版本开始的 sql_mode
中默认包含ONLY_FULL_GROUP_BY
配置
:::info
可以用 SELECT @@GLOBAL.SQL_MODE
查询一下当前 sql_mode
的结果(如图1所示)
:::
图1:sql_mode
ONLY_FULL_GROUP_BY
配置会对 GROUP BY
用法做检查:
- 当查询的某个字段不在分组字段时会报错(如图2所示)
- e.g.
SELECT id, name FROM t1 GROUP BY name
报错原因分析:
- 首先,
sql_mode
开启了ONLY_FULL_GROUP_BY
检测 - 查询的字段列表(select list)中
id
是不在分组字段列表内(group list)的
解决方案一:
- 给不在分组内的查询字段加上
any_value()
- e.g.
SELECT any_value(id) as id, name FROM t1 GROUP BY name
解决方案二:
- 将
ONLY_FULL_GROUP_BY
从sql_mode
中移除:
:::tips 注意:设置完成后立即查询仍然会报错,是因为本次登录的缓存原因,断开重连后再试就生效了。 :::SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));