背景
項目中的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