(一)報錯:sql
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。this
(三)案例分析:code
兩張表:student 學生表和scores分數表it
student表字段:io
編號 姓名 年齡 CODE NAME AGE
scores表字段:function
編號 學科 分數 CODE SUBJECT SCORE
需求是:根據學生全部學科的總分數進行排名,則常規的寫法以下,根據兩張表關聯字段CODE進行查詢,但在MYSQL5.75版本及以上的會報錯:class
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
(四)解決方案:select
(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。