2016-07-22 85 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