报错内容
SELECT list is not in GROUP BY clause and contains nonaggregated column...
错误原因
- MySQL5.7.5后only_full_group_by成为sql_mode的默认选项之一,导致一些sql语句失效,比如group by进行分组查询
查看sql_mode配置
- 在命令行输入命令查看sql_model配置:
select @@sql_mode;
- 如果查询结果有ONLY_FULL_GROUP_BY, 即为报错的原因
解决方案
- 打开MySQL安装目录下的my.ini文件,如果没有就创建,在文件的末尾添加:
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
错误分析
-
only_full_group_by: 确保group by查询是条件有且只有唯一确定的字段
- 上述报错的原因在于select字段里包含了没有被group by条件唯一确定的字段fields
- 示例:
name | country |
---|---|
张明 | 魏国 |
柳阳 | 魏国 |
李峰 | 蜀国 |
张一铭 | 蜀国 |
- 查询有多少国家:
select country from 表名 group by country;
这样的查询没有问题
- 如果这样查询:
select name,country from 表名 group by country;
因为执行group by语句实际上将同一组内多行纪录合并成一行, 同一个国家name并不相同,搜索引擎不知道该返回哪一条,违背了ONLY_FULL_GROUP_BY原则报错
- 因此在非必要还是不要去掉ONLY_FULL_GROUP_BY,错误是SQL语句本身存在问题