Php 更新MySQL后,从';sql#u mode=only#u full#u group#u by';
所以我刚刚更新到最新的MySQL,我得到了以下错误: SELECT列表的表达式#1不在GROUP BY子句中,它包含 未聚合列“stats.playtime.date”,该列不是 功能上依赖于GROUP BY子句中的列;这是 与sql\u模式不兼容=仅\u完整\u组\u由 我的桌子:Php 更新MySQL后,从';sql#u mode=only#u full#u group#u by';,php,mysql,mysqli,mysql-error-1064,Php,Mysql,Mysqli,Mysql Error 1064,所以我刚刚更新到最新的MySQL,我得到了以下错误: SELECT列表的表达式#1不在GROUP BY子句中,它包含 未聚合列“stats.playtime.date”,该列不是 功能上依赖于GROUP BY子句中的列;这是 与sql\u模式不兼容=仅\u完整\u组\u由 我的桌子: id int(255) date datetime 我的问题是: SELECT DATE(date) + INTERVAL 1 DAY, COUNT(DISTINCT id) FROM playtim
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
COUNT(DISTINCT id)
是一个聚合函数,因此允许它位于带有groupby
的select子句中。但是DATE(DATE)+INTERVAL 1 DAY
不是一个聚合函数,它不会出现在groupby
cluase中,因此这是您出错的原因
要解决此问题,您应该将未聚合列添加到与此查询类似的group by
子句中
SELECT DATE(`date`) + INTERVAL 1 DAY, COUNT(DISTINCT id)
FROM playtime
GRUP BY DATE(`date`) + INTERVAL 1 DAY
有关group by
和聚合函数的详细信息,您可以在[此处]找到。计数(不同id)是一个聚合函数,因此允许它与group by
一起位于select子句中。但是DATE(DATE)+INTERVAL 1 DAY
不是一个聚合函数,它不会出现在groupby
cluase中,因此这是您出错的原因
要解决此问题,您应该将未聚合列添加到与此查询类似的group by
子句中
SELECT DATE(`date`) + INTERVAL 1 DAY, COUNT(DISTINCT id)
FROM playtime
GRUP BY DATE(`date`) + INTERVAL 1 DAY
关于
groupby
和聚合函数的更多信息,您可以在这里找到。在第一个示例中,MySQL优化器不够聪明,无法识别表达式DATE(DATE)+INTERVAL 1 DAY
在功能上依赖于DATE(DATE)
。解决方法是在GROUPBY子句中包含整个表达式
在第二个示例中,MySQL再次抱怨SELECT列表中不在GROUPBY子句中的非聚合,因为它们在功能上不依赖
下面是一些示例表数据,演示了错误背后的基本原理:
id user course
-- ---- ------
11 fee win101
12 fi win101
13 fo win101
当我们尝试运行此查询时:
SELECT t.course, t.user
FROM mytable t
GROUP BY t.course
对于用户
,可以返回三个可能的值。。。费用,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
在第一个示例中,MySQL优化器不够聪明,无法识别表达式
DATE(DATE)+INTERVAL 1 DAY
在功能上依赖于DATE(DATE)
。解决方法是在GROUPBY子句中包含整个表达式
在第二个示例中,MySQL再次抱怨SELECT列表中不在GROUPBY子句中的非聚合,因为它们在功能上不依赖
下面是一些示例表数据,演示了错误背后的基本原理:
id user course
-- ---- ------
11 fee win101
12 fi win101
13 fo win101
当我们尝试运行此查询时:
SELECT t.course, t.user
FROM mytable t
GROUP BY t.course
对于用户
,可以返回三个可能的值。。。费用,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
@首先,我能够在我的测试服务器和实时服务器上运行这种类型的查询,而不必这样做(忽略上面提到的单独问题)。这是用于其他原因吗?或者只是为了语法允许查询运行?
date
不是保留字,stellar idea,groupby
子句中的DESC
?您确定要使用grup by
而不是order by
?@zajonc我已经简化了示例。我需要按日期对结果进行分组,这样order by在那里就无法单独工作。@FirstOne我可以在测试服务器和实时服务器上运行这种类型的查询,而不必这样做(忽略上面提到的单独问题)。这是用于其他原因吗?或者只是为了语法允许查询运行?date
不是保留字,stellar idea,groupby
子句中的DESC
?您确定要使用grup by
而不是order by
?@zajonc我已经简化了示例。我需要按日期对结果进行分组,这样order by就不会在那里单独工作了。谢谢你提供的信息!我刚刚添加了第二个导致问题的查询,在SELECT或GROUP BY中没有对其进行任何操作。关于这一点有什么想法吗?但解释是一样的-你的课程(难度)
和花费的时间(时间)列应该出现在grup by
子句上,或者你必须将它们与聚合函数一起使用,如max
,sum
,等等。谢谢你的信息!我刚刚添加了第二个导致问题的查询,在SELECT或GROUP BY中没有对其进行任何操作。关于这一点有什么想法吗?但解释是一样的-你的课程(难度)
和花费的时间(时间)列应该出现在grup by
子句上,或者你必须将它们与聚合函数一起使用,比如max
,sum
,等等。