MySQL 5.7 执行SQL报错:1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 的解决办法

背景

项目中的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