搜尋

首頁  >  問答  >  主體

SELECT語句中的列沒有在GROUP BY子句中,並且包含了非聚合的列....與sql_mode=only_full_group_by不相容

<p>我在我的Windows PC上使用MySQL 5.7.13和WAMP伺服器</p> <p>我的問題是執行這個查詢時</p> <pre class="brush:php;toolbar:false;">SELECT * FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`</pre> <p>我總是得到這樣的錯誤</p> <blockquote> <p>SELECT清單中的表達式#1不在GROUP BY子句中,並且包含非聚合列'returntr_prod.tbl_customer_pod_uploads.id',該列在GROUP BY子句中的列上沒有函數依賴關係; 這與sql_mode = only_full_group_by不相容</p> </blockquote> <p>請告訴我最好的解決方案。 </p> <p>我需要的結果如下</p> <pre class="brush:php;toolbar:false;"> ---- --------- --------- --------- -- -------- ----------- ------------ --------------- ---- ---------- ------------ -------- -------------------- - --------------------- | id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon | updatedon | ---- --------- --------- --------- ---------- --------- -- ------------ --------------- -------------- ------- ----- -------- --------------------- ---------------- ----- | 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 | ---- --------- --------- --------- ---------- --------- -- ------------ --------------- -------------- ------- ----- -------- --------------------- ---------------- ----- </pre> <p><br /></p>
P粉521748211P粉521748211522 天前650

全部回覆(2)我來回復

  • P粉300541798

    P粉3005417982023-08-22 11:53:58

    在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子句中出現的欄位或帶有聚合函數(MAXMIN、##SUMCOUNT等)的欄位


    重要說明

    使用

    point(1)或point(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
    

    回覆
    0
  • P粉278379495

    P粉2783794952023-08-22 11:13:03

    This

    將透過在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

    回覆
    0
  • 取消回覆