背景
项目中的MySQL服务器一直使用的公司内网测试服务器,前几天内网测试服务器出问题了,MySQL挂了不能提供服务,所以在本机安装了MySQL5.7.20版本(通过解压官网下载的压缩包并使用命令来安装的方式)。
项目跑起来,有些功能使用不了,查了原因,是因为执行下面的SQL报异常了:
SELECT rd.EQU_CD AS EQUCD, rd.EQU_TYPE AS EQUTYPE, DATE_FORMAT( rd.TM, '%Y-%m-%d' ) AS tm, sum( rd.ACCW ) ACCW FROM t_receivedata rd INNER JOIN ( SELECT ENG_MAN_CD, EQU_CD, EQU_TYPE FROM t_monitor GROUP BY ENG_MAN_CD, EQU_CD ) mt ON rd.EQU_CD = mt.EQU_CD WHERE mt.ENG_MAN_CD IS NOT NULL AND mt.EQU_TYPE IS NOT NULL AND YEAR ( rd.TM ) = 2019 AND MONTH ( rd.TM ) = 12 GROUP BY DATE_FORMAT( rd.TM, '%Y-%m-%d' ), rd.EQU_TYPE ORDER BY TM ASC;
异常信息如下:
1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column
原因
MySQL 5.7.5 及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL将拒绝选择列表,HAVING 条件或 ORDER BY 列表的查询引用在 GROUP BY 子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,
MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。)
解决
以Windows操作系统为例,编辑 MySQL配置文件 my.ini,在尾部添加以下内容,重新启动 MySQL 即可:
[mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
注意:如果你的my.ini文件中已经存在[mysqld]这行,就无需再添加了,只需要在[mysqld]下面添加sql_mode...这一行就行了。
参考
https://blog.csdn.net/yuanlaijike/article/details/87926596