mysql 1055




SELECT列表不在GROUP BY子句中,並且包含未聚合的列…與sql_mode=only_full_group_by不兼容 (8)

我在裝有WAMP Server的Windows PC上使用MySQL 5.7.13運行

這是我的問題是執行此查詢時

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

總是會出現這樣的錯誤

SELECT列表的表達式#1不在GROUP BY子句中,並且包含未聚合的列'returntr_prod.tbl_customer_pod_uploads.id',該列在功能上不依賴於GROUP BY子句中的列; 這與sql_mode = only_full_group_by不兼容

能否請您告訴我最好的解決方案...

我需要像這樣的結果

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

為了使查詢在SQL92中合法,必須從選擇列表中省略name列或在GROUP BY子句中命名。

如果SQL99和更高版本在功能上依賴於GROUP BY列,則按可選功能T301允許此類非聚合:如果name和custid之間存在這種關係,則查詢合法。 舉例來說,如果客戶是客戶的主鍵,那就是這種情況。

MySQL 5.7.5及更高版本實現了對功能依賴性的檢測。 如果啟用了ONLY_FULL_GROUP_BY SQL模式(默認情況下),則MySQL拒絕查詢,其中選擇列表,HAVING條件或ORDER BY列表引用未在GROUP BY子句中命名且在功能上不依賴於它們的非聚合列。

通過 dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

您可以通過使用以下命令更改sql模式來解決此問題:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

並且...記得重新連接數據庫!!!


  1. 登錄到phpMyAdmin
  2. 導航到:服務器:localhost:3306,並且不選擇任何數據庫
  3. 單擊頂部菜單中的變量
  4. 搜索“ sql模式”並將相應的值編輯為:NO_ENGINE_SUBSTITUTION

就這樣。

我在Ec2中做到了,它就像魅力一樣工作。


下面的方法解決了我的問題:

在Ubuntu

鍵入: sudo vi /etc/mysql/my.cnf

鍵入A進入插入模式

在最後一行中,粘貼以下兩個代碼:

GROUP BY `proof_type`, `id`

鍵入esc退出輸入模式

[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"

輸入sudo service mysql restart重啟MySQL。


使用任何一種解決方案

(1)PHPMyAdmin

如果您使用的是phpMyAdmin,請按照以下屏幕截圖中所述更改“ sql_mode ”設置。

編輯“ sql模式”變量,然後從值中刪除“ ONLY_FULL_GROUP_BY”文本

(2)命令提示符 運行以下命令。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

(3) 不要使用SELECT *

在SELECT查詢中使用相關列。 相關的均值列,這些列要么出現在“ group by”子句中,要么出現在具有匯總函數(MAX,MIN,SUM,COUNT等)的列中

重要的提示

通過使用point(1)或point(2)進行的更改不會永久設置,並且將在每次重新啟動後還原。

因此,您應該在配置文件中進行設置(例如[mysqld]部分中的/etc/mysql/my.cnf),以使更改在MySQL重新啟動後仍然有效:

配置文件 :/etc/mysql/my.cnf

變量名稱 :sql_mode sql-mode


從外觀上看,我認為按多個 列/字段 分組不會損害您的結果。 您為什麼不嘗試通過以下方式添加到群組:

[mysqld]
sql_mode = ""

這將首先按 proof_type 分組,然後按 id 分組。 我希望這不會改變結果。 在某些/大多數情況下,按多列分組會導致錯誤的結果。


您可以通過某些命令禁用 sql_mode = only_full_group_by ,可以通過終端或MySql IDE嘗試此操作

mysql> 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';

mysql> 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';

當MySQL的 only_full_group_by 模式打開時,這意味著使用 GROUP BY 時將應用嚴格的ANSI SQL規則。 關於您的查詢,這意味著,如果您使用 proof_type 列的 GROUP BY ,那麼您只能選擇兩項:

  • proof_type 列,或
  • 其他任何列的匯總


通過其他列的“聚合”,我的意思是將聚合函數,例如 MIN()MAX()AVG() 與另一列一起使用。 因此,在您的情況下,以下查詢將有效:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

我在SO上看到的絕大多數MySQL GROUP BY 問題都關閉了嚴格模式,因此查詢正在運行,但結果不正確。 在您的情況下,查詢根本不會運行,從而迫使您考慮您真正想做的事情。

注意:ANSI SQL通過還包括 功能上取決於 所選列的列,擴展了 GROUP BY 允許選擇的內容。 功能依賴項的一個示例是按表中的主鍵列進行分組。 由於保證每個記錄的主鍵都是唯一的,因此任何其他列的值也將確定。 MySQL是允許這樣做的數據庫之一(SQL Server和Oracle不支持AFAIK)。


這個

SELECT列表的表達式#1不在GROUP BY子句中,並且包含未聚合的列'returntr_prod.tbl_customer_pod_uploads.id',該列在功能上不依賴於GROUP BY子句中的列; 這與sql_mode = only_full_group_by不兼容

只需通過以下命令在MySQL中更改sql模式即可解決,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

這也對我有用。我用了它,因為在我的項目中有很多這樣的查詢,所以我只是將此sql模式更改為only_full_group_by

謝謝... :-)







mysql-error-1055