Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'ie_llyh.u.ChkPlanID'; this is incompatible with sql_mode=only_full_group_by
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'ie_llyh.u.ChkPlanID'; this is incompatible with sql_mode=only_full_group_by
1 出现原因:
在sql中使用了GROUP_CONCAT进行组合,如果是其他group by 原因请自行寻找其他解决方式
网上解释原因:
在MySQL5.7.5后,默认开启了ONLY_FULL_GROUP_BY,所以导致了之前的一些SQL无法正常执行,其实,是我们的SQL不规范造成的,因为 之后,返回的一些数据是不确定的,所以才会出现这个错误。
2 解决方法
方法一
代码修改SQL
涉及到 GROUP_CONCAT 的sql部分进行改写
例子
表class 班级表
- 字段 cid 班级id
表classUser 班级学生对应表
- 字段 id 主键
- 字段 cid 班级id
- 字段 uid 学生id
表userInfo 学生信息表
- 字段 uid 学生id
- 字段 name 学生姓名
原代码
select a.cid
GROUP_CONCAT(c.name SEPARATOR ',') as allName
from class a
LEFT JOIN classUser b ON a.cid = b.cid
LEFT JOIN UserInfo c ON c.uid = b.uid
WHERE 1=1
修改后
select a.cid
b.name as allName
from class a
LEFT JOIN (
select GROUP_CONCAT(b.name SEPARATOR ',') as name , a.cid from classUser a
left join UserInfo b on a.uid = b.uid
group by a.cid
)b on a.cid = b.cid
where 1=1
方法二 (网上方法未验证)
关闭ONLY_FULL_GROUP_BY,我的是Linux环境,我就说一下Linux的解决步骤:
登录进入MySQL
linux登录的:mysql -u username -p ,然后输入密码,输入SQL:show variables like ‘%sql_mode’;
编辑my.cnf文件
文件地址一般在:/etc/my.cnf,/etc/mysql/my.cnf
找到sql-mode的位置,去掉ONLY_FULL_GROUP_BY,然后重启MySQL
有的my.cnf中没有sql-mode,需要加入:
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服务
service mysql restart,重启好后,再登录mysql,输入SQL:show variables like ‘%sql_mode’; 如果没有ONLY_FULL_GROUP_BY,就说明已经成功了。