今天晚上電腦上的數據庫突然抽風,怎么也連不上了,查了好久的資料說可能是跟我在本機搭建的java項目有關,跟着資料弄了半天,問題還是沒有解決,只好另求出路。
想起之前安裝過一個linux虛擬機,就想借用虛擬機上的sql,沒想到在寫分組查詢的時候一直報下面這個錯:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'user.t_user.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
同樣查詢了網上的教程,得知了問題出現的原因:
MySQL 5.7.5及以上功能依賴檢測功能。如果啟用了ONLY_FULL_GROUP_BY SQL模式(默認情況下),MySQL將拒絕選擇列表,HAVING條件或ORDER BY列表的查詢引用在GROUP BY子句中既未命名的非集合列,也不在功能上依賴於它們。(5.7.5之前,MySQL沒有檢測到功能依賴關系,默認情況下不啟用ONLY_FULL_GROUP_BY。有關5.7.5之前的行為的說明,請參見“MySQL 5.6參考手冊”。)
也就是說如果想在5.7.5之后的版本正常使用分組功能,在select指定的字段要么就要包含在Group By語句的后面作為分組的依據;要么就要被包含在聚合函數中。
官方這么規定,自然是有它的道理,但是用習慣了之前版本的group by,這一時半會的也改不過來。
好在他也同時提供了解決方案,如下:
輸入查詢語句: SELECT @@GLOBAL.sql_mode;
輸入查詢語句: SELECT @@SESSION.sql_mode;
第一項 ONLY_FULL_GROUP_BY 就是問題的根源,我們把它去掉就好了
輸入sql語句: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';
設置成功之后,再次查詢SELECT @@SESSION.sql_mode; 就會發現ONLY_FULL_GROUP_BY 這一項已經沒有了,但是在GLOBAL里面還會有,但是不影響執行,所以不用管就行~
再次執行之前的分組sql語句,就不會再報錯同樣的錯啦 ~~~ 撒花,開心~~