错误:“gisq.game.mdate”不在group by中

xmjla07d  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(365)

表格链接如下:http://sqlzoo.net/wiki/the_join_operation
第11题
对于每场涉及“pol”的比赛,显示比赛ID、日期和进球数。
当我的查询是:-

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

我的回答是对的。
问题:-我在堆栈溢出的某个地方读到,groupby函数需要select语句中写入的所有内容。但是为什么count(player)不包含在groupby子句中呢?

xwbd5t1u

xwbd5t1u1#

为什么count(player)不包含在group by子句中?
因为 count(player) 聚合函数不需要添加吗 group by 使用聚合函数时,需要在中添加非聚合列 GROUP BY 条款。
在这个例子中 count 是聚合函数。您需要添加 matchid 以及 mdate 中的列 GROUP 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引擎来说是未知的,它应该为此类列返回哪个值。
h7appiyu

h7appiyu2#

当您按分组时,它对sql的意义是您需要分组方式中列出的字段的唯一组合。
然后您可以选择这些字段,而不必使用诸如count、max、min、sum、avg等聚合函数。。。
但这一规则也起相反的作用。
例如,此查询。

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

查询需要根据groupby得到唯一的x。
但是对于x,y应该显示什么呢?值为“bar1”或“bar2”的那个?
这个 MAX(z) 不必在groupby中,因为它是一个聚合函数。
这种函数的返回值甚至取决于groupby中的字段。
如果这是sql,它肯定知道要为y显示什么

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

所以这就是为什么至少在大多数数据库中,如果不使用聚合函数选择x和y,它们就必须在group by中。这是sql92标准。
mysql可以更宽容地对待这个规则。
如果编码人员知道他们在做什么,这是很好的。但也可能导致误导性结果。
但是这个测试站点显然不允许mysql接受groupby中缺少的字段。

相关问题