一、基礎環境
linux centos 7, mysql 5.7.26
二、問題描述
使用group by 進行分組查詢時,提示異常: SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode =only_full_group_by
三、問題原因
大概查了一下相關原因,意思是:當你使用group by 做分組查詢時,分組使用的列,那么你select就必須帶上分組的列,是因為mysql5.7以上版本增加了sql_mode=ONLY_FULL_GROUP_BY 的設定,這一點在異常描述里面也提示了。
舉個例子:
select id,name from Users group by id,sex; 如果這里select的列不帶上sex,那么就會報上面這個異常。
四、解決方式
按照實際業務操作,上面例子這種sql寫法是存在的,並且應用挺多,那么我們想讓例子的這種寫法符合mysql規范的話,就需要更改mysql的sql_mode配置了,具體操作如下:
通過sql的方式更改sql_mode(當前生效,重啟mysql后失效)
進入mysql客戶端,執行以下命令:
select @@GLOBAL.sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
發現存在ONLY_FULL_GROUP_BY, 執行以下設置即可:
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';
通過mysql配置my.cnf更改sql_mode(一勞永逸)