1. 程式人生 > 實用技巧 >sql查詢出現1055 this is incompatible with sql_mode=only_full_group_by

sql查詢出現1055 this is incompatible with sql_mode=only_full_group_by

我出現的1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yinhuanwlmq.p.name' which is not functionally dependent on columns in GROUP BY clause;this is incompatible with sql_mode=only_full_group_by

背景:今天小程式上線,關於報表類的sql語句有些在linux全部不能執行,而在windows環境下可以,找了很久

異常如下

查詢出現如下異常:

	SELECT t.name,t.mobile FROM t_test t
	WHERE t.code='1001'
	group by t.time

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘testdb.t.time’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

這句話什麼意思呢:
一句話:“錯誤程式碼:1055與sql_mode = only_full_group_by不相容”
“錯誤程式碼:1055。SELECT列表的表示式#1不在GROUP BY子句中,並且包含非聚合列’testdb.t.time’,它在功能上不依賴於GROUP BY子句中的列; 這與sql_mode = only_full_group_by不相容”

原因分析

在MySQL5.7.5後,預設開啟了ONLY_FULL_GROUP_BY,所以導致了之前的一些SQL無法正常執行,其實,是我們的SQL不規範造成的,因為group by 之後,返回的一些資料是不確定的,所以才會出現這個錯誤。

解決辦法

第一種
1、登入進入MySQL

linux登入的:mysql -u username -p ,然後輸入密碼,輸入SQL:show variables like ‘%sql_mode’;

2、編輯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

注意要加入到[mysqld]下面,我就是加入到其他地方,重啟後也不生效,具體的如下圖:

3、修改成功後重啟MySQL服務,service mysql restart,重啟好後,再登入mysql,輸入SQL:show variables like ‘%sql_mode’; 如果沒有ONLY_FULL_GROUP_BY,就說明已經成功了。

第二種_修改SQL

不一定要禁用ONLY_FULL_GROUP_BY 給定這樣的情況,根據mysql文件,“如果name不是t的主鍵或唯一的NOT NULL列,則此查詢無效。在這種情況下,不可以推斷出功能依賴性併發生錯誤。

相反,可以使用此ANY_VALUE(‘my_column_name’) my_column_name 引用mysql文件,
“在這種情況下,MySQL忽略每個名稱組中的地址值的不確定性並接受查詢。” 使用ANY_VALUE()來引用地址。
因為出現這個問題,基本都是因為這個問題造成的,不確定返回欄位可以使用ANY_VALUE(column_name)。

錯誤sql
	SELECT t.name,t.mobile FROM t_test t
	WHERE t.code='1001'
	group by t.store_time
正確sql
	SELECT ANY_VALUE(t.name),ANY_VALUE(t.mobile) FROM t_test t
	WHERE t.code='1001'
	group by t.time

***order by