所以我刚刚更新到最新的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
答案 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