错误:“ gisq.game.mdate”不在GROUP BY

时间:2018-08-12 19:32:36

标签: mysql sql oracle11g group-by

到表的链接在这里给出: http://sqlzoo.net/wiki/The_JOIN_operation

问题编号:-其中11个

对于每一次涉及“ POL”的比赛,请显示比赛编号,日期和进球数。

当我的查询是:-

SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid

在这种情况下出错。

但是当我的查询是:-

SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid, mdate

我的回答是正确的。

问题:-我在堆栈溢出的某个地方读到,按功能分组需要在select语句中编写的所有内容。 但是为什么count(player)没有包含在GROUP BY子句中?

2 个答案:

答案 0 :(得分:1)

当您使用GROUP BY时,对于SQL而言意味着您想要的是GROUP BY中列出的字段的唯一组合。

然后您可以选择这些字段,而不必使用它们,例如COUNT,MAX,MIN,SUM,AVG等聚合函数。

但是该规则也可以相反。

例如此查询。

SELECT x, y, MAX(z)
FROM foo
GROUP BY x

查询要根据GROUP BY获得唯一的x。
但是对于x应该显示什么y?值是“ bar1”还是“ bar2”的那个?

MAX(z)不必在GROUP BY中,因为它是一个聚合函数。
该函数的返回值甚至取决于GROUP BY中的哪些字段。

如果这是SQL,它将确定要为y显示什么

SELECT x, MIN(y), AVG(z)
FROM foo
GROUP BY x

因此,这就是为什么如果您在不使用聚合函数的情况下选择x和y,则至少在大多数数据库中,x和y都必须位于GROUP BY中。这是SQL92标准。

MySql可以更宽容地对待该规则。
如果编码人员知道他们在做什么,那通常很好。但也可能导致误导结果。

但是该测试站点显然不允许其MySql接受GROUP BY中的缺失字段。

答案 1 :(得分:0)

  

为什么count(player)不包含在GROUP BY子句中?

因为count(player)聚合函数,它不会添加到group by

使用聚合函数时,需要在GROUP BY子句中添加非聚合列。

在此示例中,count是聚合函数。您需要在matchid中添加mdateGROUP BY

SELECT matchid, mdate, count(player)
FROM game join goal on id = matchid
WHERE (team1 = 'POL' or team2 = 'POL')
GROUP BY matchid, mdate

如果您未在GROUP BY子句中指定非聚合列的列名,则聚合函数对于SQL引擎来说是未知的,它将为该类型的列返回哪个值。