MyBatis项目中使用GROUP BY分组查询出现异常的原因分析和修复记录

报错内容

SELECT list is not in GROUP BY clause and contains nonaggregated column...

错误原因

  • MySQL5.7.5only_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语句本身存在问题
上一篇:C++字符串的处理-----全部用库函数,效率高


下一篇:[ SOS ] 版本控制工具 笔记