使用 GROUP BY
语句出现错误:
1 | [SQL]SELECT |
可以看到我的SQL语句是
1 | SELECT |
查询资料得知,执行命令
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语句中select
了id
和sq_resident_id
,那么这两个字段都得在GROUP_BY
中
1 | SELECT |
这样执行就不会报错了,但是我不需要分组id
字段,去掉即可,然后我要统计sq_resident_id
字段的重复值
1 | SELECT |
总结,如果 sql_mode
设置了 ONLY_FULL_GROUP_BY
,那么select
字段要出现在GROUP_BY
中
解决方法
方法1
复制查询sql_mode
的结果,去掉ONLY_FULL_GROUP_BY,
,然后执行sql命令
1 | 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'; |
注意:该方法仅用于临时修改,重启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 | ... |
建议使用第三种方法