1.這個錯誤發生在mysql 5.7 版本及以上版本會出現的問題:
mysql 5.7版本默認的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",這個配置嚴格執行了"SQL92標准"
2.在sql執行時,出現該原因:
簡單來說就是:輸出的結果是叫target list,就是select后面跟着的字段,還有一個地方group by column,就是
group by后面跟着的字段。由於開啟了ONLY_FULL_GROUP_BY的設置,所以如果一個字段沒有在target list
和group by字段中同時出現,或者是聚合函數的值的話,那么這條sql查詢是被mysql認為非法的,會報錯誤。
3.解決方法
1)可以采取臨時解決方法,但mysql重啟后仍然會報這個錯誤
查看版本號:select version();
可以看到我的版本是5.7版本以上的,
查詢模型:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
可以看到mysql的配置是含有sql_mode="ONLY_FULL_GROUP_BY"的,
接下來執行以下4條sql語句即可解決:
set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,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 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 @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
2)最終解決辦法
修改MySQL的配置文件
我是在linux服務上用docker安裝的mysql,進入mysql容器中,進入/etc/mysql目錄下修改my.cnf文件 在 [mysqld] 下面添加代碼:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
但是經過我cat my.conf 發現此配置文件並沒有[mysqld]這一項 看到配置文件中引入了/etc/mysql/conf.d/, /etc/mysql/mysql.conf.d/兩個目錄中的文件
經過查看 在引入的文件mysql.conf.d文件夾下有個mysqld.cnf文件中含有[mysqld]配置 便在該配置文件中加入上述的配置,保存之后重啟mysql容器
這樣便可永久解決問題
ps:不同的系統,mysql 的配置文件名以及路徑不同
1、Mac或Linux文件 /etc/my.cnf
2、windows 在數據庫安裝目錄下的 my.ini