MyBatis项目中使用GROUP BY分组查询出现异常的原因分析和修复记录
【摘要】 本篇文章记录了在MyBatis项目中使用SQL中的分组查询GROUP BY语句,查询多个字段时数据查询报错的问题。分析了导致GROUP BY查询语句报错的原因并提出解决这样问题的方法。通过对这样问题的解决记录,可以帮助大家在使用MyBatis中的GROUP BY查询时避免出现一些问题。
报错内容
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语句本身存在问题
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)