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

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

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。