which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
在執行一個同僚發的sql時發現group by 有問題,
select max(id) as id,c_service_time,c_adress,c_rfid_sign from t_records group by c_rfid_sign;
原因在于5.7版本後mysql的sql_mode有了ONLY_FULL_GROUP_BY這個模式限制,就是查詢的列都要在group by中,或者是聚合列(使用了max、min、avg、sum聚合函數)
解決辦法有兩類
一、修改mysql的sql_mode設定
首先可以執行如下指令檢視sql_mode設定
1、SHOW SESSION VARIABLES;
2、SHOW GLOBAL VARIABLES;
3、select @@sql_mode;
結果是ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
執行如下指令修改sql_mode
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
二、修改查詢sql
select * from t_records where id in(select max(id) from t_records group by c_rfid_sign );
select * from t_records a where not exists( select * from t_records b where a.c_rfid_sign=b.c_rfid_sign and a.id<b.id);
三、sql_mode說明
引用https://blog.csdn.net/u014520745/article/details/76056170
ONLY_FULL_GROUP_BY: 對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP
BY中出現,那麼這個SQL是不合法的,因為列不在GROUP BY從句中
NO_AUTO_VALUE_ON_ZERO: 該值影響自增長列的插入。預設設定下,插入0或NULL代表生成下一個自增長值。如果使用者
希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。
STRICT_TRANS_TABLES: 在該模式下,如果一個值不能插入到一個事務表中,則中斷目前的操作,對非事務表不做限制
NO_ZERO_IN_DATE: 在嚴格模式下,不允許日期和月份為零
NO_ZERO_DATE: 設定該值,mysql資料庫不允許插入零日期,插入零日期會抛出錯誤而不是警告。
ERROR_FOR_DIVISION_BY_ZERO: 在INSERT或UPDATE過程中,如果資料被零除,則産生錯誤而非警告。如
果未給出該模式,那麼資料被零除時MySQL傳回NULL
NO_AUTO_CREATE_USER: 禁止GRANT建立密碼為空的使用者
NO_ENGINE_SUBSTITUTION:
如果需要的存儲引擎被禁用或未編譯,那麼抛出錯誤。不設定此值時,用預設的存儲引擎替代,并抛出一個異常
PIPES_AS_CONCAT:
将”||”視為字元串的連接配接操作符而非或運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數Concat相類似
ANSI_QUOTES: 啟用ANSI_QUOTES後,不能用雙引号來引用字元串,因為它被解釋為識别符