更新MySQL后,从'sql_mode = only_full_group_by'获取奇怪的JOIN错误

时间:2016-07-22 20:29:16

标签: php mysql mysqli mysql-error-1064

所以我刚刚更新到最新的MySQL,我收到了这个错误:

  

SELECT列表的表达式#1不在GROUP BY子句中并且包含   nonaggregated列'stats.playtime.date'不是   功能上依赖于GROUP BY子句中的列;这是   与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

2 个答案:

答案 0 :(得分:3)

在第一个示例中,MySQL优化器不够智能,无法识别表达式ViewModel在功能上依赖于DATE(date) + INTERVAL 1 DAY。解决方法是将整个表达式包含在GROUP BY子句中。

在第二个例子中,MySQL再次关注SELECT列表中不在GROUP BY子句中的非聚合,因为它们不依赖于函数。

以下是一些示例表数据,用于演示错误背后的基本原理:

DATE(date)

当我们尝试运行此查询时:

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

SELECT t.course, t.user FROM mytable t GROUP BY t.course 可以返回三种可能的值...费用,费用或费用。

如果我们使用聚合表达式代替列,MySQL将允许查询运行。在这个例子中,我们可以使用MIN(t.user)或MAX(t.user),MySQL将分别返回“fee”或“fo”。

MySQL将运行此查询:

user

答案 1 :(得分:1)

COUNT(DISTINCT id)是一个聚合函数,因此允许它在group by的select子句中。但DATE(date) + INTERVAL 1 DAY不是聚合函数,它不会出现在group by cluase中,因此这是您出错的原因。

要解决此问题,您应该将未聚合的列添加到group by子句中,就像在此查询中一样

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

有关group by的更多信息以及您可以在此处找到的汇总函数。1