(一)報錯:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘...’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。
(二) 問題出現的原因:
MySQL 5.7.5及以上功能依賴檢測功能。如果啟用了ONLY_FULL_GROUP_BY SQL模式(預設情況下),MySQL将拒絕選擇清單,HAVING條件或ORDER BY清單的查詢引用在GROUP BY子句中既未命名的非集合列,也不在功能上依賴于它們。(5.7.5之前,MySQL沒有檢測到功能依賴關系,預設情況下不啟用ONLY_FULL_GROUP_BY。
(三)案例分析:
兩張表:student 學生表和scores分數表
student表字段:
編号 姓名 年齡
CODE NAME AGE
scores表字段:
編号 學科 分數
CODE SUBJECT SCORE
需求是:根據學生所有學科的總分數進行排名,則正常的寫法如下,根據兩張表關聯字段CODE進行查詢,但在MYSQL5.75版本及以上的會報錯:
SELECT
s1.CODE,
s1.NAME,
s1.AGE,
sum(SCORE) as ALLSCORE
FROM student s1
LEFT JOIN scores s2
ON s1.CODE = s2.CODE
GROUP BY CODE
ORDER BY ALLSCORE DESC
(四)解決方案:
(1)調整SQL查詢語句
在GROUP BY後面加上查詢出來的字段:
SELECT
s1.CODE,
s1.NAME,
s1.AGE,
sum(SCORE) as ALLSCORE
FROM student s1
LEFT JOIN scores s2
ON s1.CODE = s2.CODE
GROUP BY CODE,NAME,AGE
ORDER BY ALLSCORE DESC
(2)去掉ONLY_FULL_GROUP_BY
用navcat打開資料庫,執行SQL語句:select @@global.sql_mode,查詢的值為:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
去掉ONLY_FULL_GROUP_BY,重新設定值,執行:
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。