In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column...
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column ‘mydb.student.sname’; this is incompatible with sql_mode=only_full_group_by
maven項目報錯error:
expression #2 of SELECT list contains nonaggregated column ‘newhelp.appr.title’; this is incompatible with sql_mode=only_full_group_by
這是因為隨著MySQL版本更新帶來的問題,在MySQL5.7版本之后對group by進行了優(yōu)化。他默認啟動改進之后的
版本啟動了ONLY_FULL_GROUP_BY模式。
這種模式的官方解釋:ONLY_FULL_GROUP_BY是MySQL數據庫提供的一個sql_mode,通過這個sql_mode來保證
SQL語句“分組求最值”合法性的檢查。這種模式采用了與Oracle、DB2等數據庫的處理方式。即不允許select target list
中出現語義不明確的列。
通俗的講就是:對于用到GROUP BY的select語句,查出來的列必須是group by后面聲明的列,或者是聚合函數里面的列
有這樣一個數據庫的表
select語句:select id, sum(appr_id) from appr group by id------------------------------------(合法)
select語句:select id, user_id, sum(appr_id) from appr group by id-------------------------(合法)
select語句:select id, sum(appr_id) from appr group by role----------------------------------(不合法)
select語句:select id, user_id, sum(appr_id) from appr group by role-----------------------(不合法)
select語句:select * from appr group by role-------------------------------------------------------(不合法)
經過大量測試:筆者發(fā)現了ONLY_FULL_GROUP_BY這種模式的特點:
1:只要有聚合函數sum(),count(),max(),avg()等函數就需要用到group by,否則就會報上面的錯誤。
2:group by id(id是主鍵)的時候,select什么都沒有問題,包括有聚合函數。
3:group by role(非主鍵)的時候,select只能是聚合函數和role(group by的字段),否則報錯
如果我們不想用用ONLY_FULL_GROUP_BY的模式。有兩種解決這種問題的方案:
1:命令行中輸入:
set @@GLOBAL.sql_mode=’’;
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重啟之后又會恢復。
2:修改MySQL的配置文件,
1、windows下找到MySQL的安裝目錄的my.ini文件,修改其中的配置為不啟動ONLY_FULL_GROUP_BY模式
刪掉帶有ONLY_FULL_GROUP_BY的模式就ok了,如果沒有找到my.ini文件。
去系統(tǒng)的隱藏文件夾查看,在某個盤下輸入%ProgramData%然后搜索MySQL的my.ini文件
2、linux下找到my.cnf文件,這個是配置MySQL的文件。一般這個文件是在etc文件夾下。
vi my.cnf 編輯這個文件,然后在圖示的位置上加入sql_mode =
"STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FO
R_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
然后重啟MySQL服務:service mysqld restart
注意:服務重啟之后不一定立即生效,尤其是你買的服務器,存在延時。所以可能等一兩個小時才生效。
goodluck!
————————————————
版權聲明:本文為CSDN博主「不墜青云之志」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_43279637/article/details/84842189
總結
以上是生活随笔為你收集整理的In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唯有自己变得强大_唯有自己变得强大,才能
- 下一篇: java数组中的内存特征