P粉5236250802023-08-21 10:10:51
在MySQL引擎中有一個系統變數ONLY_FULL_GROUP_BY
。
從MySQL版本5.7.5開始:預設啟用ONLY_FULL_GROUP_BY
SQL模式。
在5.7.5版本之前:預設未啟用ONLY_FULL_GROUP_BY
。
如果啟用了ONLY_FULL_GROUP_BY
SQL模式(從5.7.5版本開始預設啟用),MySQL將拒絕查詢選擇清單、HAVING
條件或ORDER BY
#清單引用非聚合列,這些列既不在GROUP BY
子句中命名,也不與其功能相關。
(1) PHPMyAdmin
停用:ONLY_FULL_GROUP_BY
模式
如果您使用的是phpMyAdmin,則根據下面的截圖變更sql_mode
設定。
#編輯sql mode
變數並從值中刪除ONLY_FULL_GROUP_BY
文字
或
(2) SQL/命令提示字元
透過執行下列指令停用:ONLY_FULL_GROUP_BY
模式。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或
(3) 不要使用SELECT *
不要停用ONLY_FULL_GROUP_BY
模式,而是
在SELECT
查詢中使用相關欄位。相關列指的是group by
子句中出現的欄位或帶有聚合函數(MAX
、MIN
、##SUM、
COUNT等)的欄位
點(1)或點(2)進行的更改不是永久設置,每次重新啟動後都會還原。
[mysqld]部分的
/etc/mysql/my.cnf檔案中),以便在MySQL重新啟動後保持變更生效:
設定檔:/etc/mysql/my.cnf
#變數名稱:sql_mode
或 #sql-mode
ONLY_FULL_GROUP_BY一詞並儲存檔案。
注意:如果在設定檔中找不到sql_mode變量,請在檔案結尾插入以下2行
[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
P粉1210816582023-08-21 00:49:48
這個問題可以透過在MySQL中更改sql模式來簡單解決,使用以下命令:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
對我也有效...
我使用了這個方法,因為在我的專案中有很多類似的查詢,所以我只是將sql模式更改為only_full_group_by。
或簡單地在GROUP BY子句中包含SELECT語句指定的所有欄位。可以保持啟用sql_mode。
謝謝... :-)
更新日期:2023年7月14日
更改SQL模式是一種解決方法,但是對於結構化查詢語言的最佳實踐是避免選擇所有(SELECT * ...)列,而是在分組列上使用聚合函數,如@Tim Biegeleisen在以下的回答中提到的https://stackoverflow.com/a/41887524/3602846
#