2016-07-22 84 views
0

所以我只更新到最新的MySQL和我得到這個錯誤:更新MySQL中,遇到奇怪的 '的sql_mode = only_full_group_by' 加入錯誤後

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'stats.playtime.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我的表:

id int(255) 
date datetime 

我的查詢:

SELECT DATE(date) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GROUP BY DATE(date) 

它所做的就是告訴我,有多少用戶第一次參加在某一特定日期,讓我將這些數據顯示在圖表中。

我不確定這個查詢有什麼問題嗎?我發現在這個新版本的MySQL中必須有新的語法規則,但我不確定如何使用這個查詢來關注它們。有任何想法嗎?

第二個例子導致了同樣的問題:

表:

id     int(11) 
user    varchar(255) 
course    varchar(255) 
course_difficulty varchar(255) 
time_taken   int(255) 

查詢:

SELECT course, course_difficulty, time_taken 
FROM minigame 
WHERE user = 'abc' 
GROUP BY course 
ORDER BY time_taken LIMIT 50 
+0

@FirstOne我能,而不必做對我的測試和現場服務器(忽略上面提到的另一個問題)都運行此類型的查詢。這是用於其他原因嗎?或者只是爲了允許查詢運行的語法? – user3420034

+2

'日期'不是保留字,恆星的想法,[可能不是](http://i.imgur.com/oUwa6hG.jpg) – Drew

+0

'group by'子句中的'DESC'?你確定要使用'grup by'而不是'by order by'嗎? – zajonc

回答

3

在第一個示例中,MySQL優化器不夠智能,無法識別表達式DATE(date) + INTERVAL 1 DAY在功能上依賴於DATE(date)。解決方法是將整個表達式包含在GROUP BY子句中。

在第二個示例中,MySQL正在抱怨SELECT列表中不屬於GROUP BY子句的非聚合,因爲它們在功能上並不相關。

下面是一些演示錯誤的理由示例表數據:

id user course 
-- ---- ------ 
11 fee win101 
12 fi  win101 
13 fo  win101 

當我們嘗試運行此查詢:

SELECT t.course, t.user 
    FROM mytable t 
GROUP BY t.course 

有可能對user返回三個可能的值...費用,fi或fo。

如果我們使用聚合表達式代替列,MySQL將允許查詢運行。在這個例子中,我們可以使用MIN(t.user)或MAX(t.user),MySQL將分別返回「fee」或「fo」。

MySQL將運行此查詢:

SELECT t.course 
    , MIN(t.user) AS min_user 
    , MAX(t.user) AS max_user 
    , COUNT(1) 
    FROM mytable t 
GROUP BY t.course 
1

COUNT(DISTINCT id)是一個聚合函數,所以它允許在與SELECT子句group by。但DATE(date) + INTERVAL 1 DAY不是聚合函數,它不出現在group by cluase中,所以這是你錯誤的原因。

爲了解決這個問題,你應該在此查詢

SELECT DATE(`date`) + INTERVAL 1 DAY, COUNT(DISTINCT id) 
FROM playtime 
GRUP BY DATE(`date`) + INTERVAL 1 DAY 

更多信息添加你沒有聚集列成group by條款像約group by和聚集功能,你可以找到[這裏]。 1

+0

感謝您的信息!我剛剛添加了第二個查詢導致的問題,我不在SELECT或GROUP BY中使用任何操作。對此有任何想法? – user3420034

+0

但是解釋是一樣的 - 你的專欄'course_difficulty'和'time_taken'應該出現在'grup by'子句中,或者你必須將它們用於'max','sum'等聚合函數。 – zajonc