Php 更新MySQL后,从';sql#u mode=only#u full#u group#u by';

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

所以我刚刚更新到最新的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  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
,等等。