您好,我正在閱讀有關 SQL 連接的教程,下面的陳述句拋出“sql_mode=only_full_group_by”錯誤。我直接從教程中復制了這個,它為他作業。我只需要在終端中禁用此模式嗎?
SELECT *
FROM customers
JOIN orders
ON customers.id = orders.customer_id
GROUP BY orders.customer_id;
uj5u.com熱心網友回復:
如果ONLY_FULL_GROUP_BY啟用了 SQL 模式(默認情況下),MySQL 拒絕select串列、HAVING條件或ORDER BY串列參考非聚合列的查詢,這些列既不在GROUP BY子句中命名,也不在功能上依賴于它們。[1]
您可以禁用此功能,但啟用它確實很有意義。考慮以下情況:
id | type
---|-----
1 | foo
2 | foo
3 | bar
如果您使用與您的查詢類似的查詢,select * from table group by type您希望輸出是什么?也許您希望有兩行foo和bar,但是您希望id列中的內容是什么,即foo記錄?我們應該只選擇最早的記錄嗎?最新記錄?隨機記錄?這就是錯誤告訴您的內容 - 您必須明確說明,而不是讓資料庫引擎為您選擇。
因此,在您的示例中,您需要考慮生成的資料應該是什么樣子。也許不是select *你想要的select customers.name, count(*) ...,等等。
這適用于您正在遵循的教程的原因是他們沒有only_full_group_by啟用,或者他們使用的是早于 5.7.5 的 MySql 版本,其中引入了這一點。在這種情況下,服務器可以從每個組中自由選擇任何值,這可能不是您想要的。
最后,如果您希望控制臺以與教程相同的方式運行,您可以通過以下方式ONLY_FULL_GROUP_BY在控制臺中禁用:
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
[1] https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480029.html
下一篇:參考SELECT之外的JOIN
