Mysql 1055 错误 SELECT list is not in GROUP BY clause and contains nonaggregated column

使用 GROUP BY 语句出现错误:

1
2
3
4
5
6
7
[SQL]SELECT
id,sq_resident_id
FROM
sq_resident_family_info
GROUP BY sq_resident_id

[Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xyzj_sql_0320.sq_resident_family_info.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

可以看到我的SQL语句是

1
2
3
4
5
SELECT
id,sq_resident_id
FROM
sq_resident_family_info
GROUP BY sq_resident_id

查询资料得知,执行命令

1
select @@global.sql_mode;

或者

1
SELECT @@sql_mode

结果为

1
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

含有 ONLY_FULL_GROUP_BY,说明设置了此模式。mysql5.7.5后,ONLY_FULL_GROUP_BY 默认为真,那么此时select中的字段必须出现在group by中。

那么在我的SQL语句中selectidsq_resident_id,那么这两个字段都得在GROUP_BY

1
2
3
4
5
SELECT
id,sq_resident_id
FROM
sq_resident_family_info
GROUP BY sq_resident_id, id

这样执行就不会报错了,但是我不需要分组id字段,去掉即可,然后我要统计sq_resident_id字段的重复值

1
2
3
4
5
6
SELECT
count(id), sq_resident_id
FROM
sq_resident_family_info
GROUP BY
sq_resident_id

总结,如果 sql_mode 设置了 ONLY_FULL_GROUP_BY ,那么select字段要出现在GROUP_BY

解决方法

方法1

复制查询sql_mode的结果,去掉ONLY_FULL_GROUP_BY,,然后执行sql命令

1
2
3
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

注意:该方法仅用于临时修改,重启mysql后,以上设置失效。

方法2

启动mysql时,增加sql_model选项,如下:

1
mysqld --sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" [...其它选项]

方法3

Linux服务下,修改my.conf (Windows下修改my.ini),在[mysqld]节点下,最末尾添加sql_mode配置,

1
2
3
4
5
6
7
8
9
10
11
...

[mysqld]

...

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

[其它节点配置]

...

建议使用第三种方法

坚持原创技术分享,您的支持将鼓励我继续创作!
0%