Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么使用GROUPBY的SQL查询会产生更多的行?_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 为什么使用GROUPBY的SQL查询会产生更多的行?

Mysql 为什么使用GROUPBY的SQL查询会产生更多的行?,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有下表: +------+-------+--------------------------------------+ | id | rev | content | +------+-------+--------------------------------------+ | 1 | 1 | ... | | 2 | 1 | ...

我有下表:

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+
当我运行以下查询时:

SELECT id, MAX(rev) maxrev, content
FROM YourTable
GROUP BY id;
SELECT id, MAX(rev) maxrev, content
FROM YourTable
GROUP BY id;
我得到:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
| 2    |    1     | ...                                  |
+------+----------+--------------------------------------+
+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
+------+----------+--------------------------------------+
但如果我删除GROUP BY子句,如下所示:

SELECT id, MAX(rev) maxrev, content
FROM YourTable;
我得到:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
| 2    |    1     | ...                                  |
+------+----------+--------------------------------------+
+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
+------+----------+--------------------------------------+
这与我的直觉背道而驰,因为我期望通过消除重复值来减少结果的数量。然而,在上述情况下,集团的引入却适得其反。这是因为MAX()函数吗?如果是的话,原因是什么

PS:该表基于此处的SO问题:。我试图理解这个问题的答案,在这个过程中,我遇到了上述情况

编辑:

我在sqlfiddle.com上使用其MySQL 5.6引擎获得了上述结果,无需定制/配置。

它正在使用依赖于GROUP BY子句的MAX()函数。因此,对于您的第一个查询,您是说:为每个id提供最大rev,而第二个查询只是说总体上为我提供最大rev

感谢xQbert:

这并不意味着在后一种情况下,您将获得具有最大转速的行。它将从所选内容中的任何位置获取用于id和内容字段的值


您可以在此处阅读有关SQL如何处理GROUP BY语句的更多信息:

这是因为您使用的是mysql 5.7的Previous版本。这些版本允许使用聚合d函数并选择不在GROUP BY中的列。。。这将为未聚合列生成不可预测的结果。。在mysql 5.7中,不允许使用此beahvior。。。如果在group by中未提及的select not aggregated函数中选择,则会出现错误

正确的sintax显然是第一个

运行此操作时,由于表中有两个不同的id,因此结果中有两行,每个id有一行的最大值。分组发生在id列上

SELECT id, MAX(rev) maxrev, content
FROM YourTable;

如果删除GROUPBY子句,则在结果中只会得到与整个表中的max值相对应的一行。没有按id分组。

@litelite否,如果不使用
分组,它将聚合表中的所有行而不进行分组。@litelite取决于您的MySQL设置。较新的版本在默认情况下更严格。因为您使用的是mySQL版本,该版本通过允许您对“选择未聚合”中的零或所有字段进行聚合来扩展组。。如果未启用扩展,当前版本的mySQL将抛出语法错误。因为您没有按内容分组,所以它只选择一个值,因为所有值现在都相同,所以它们属于同一组。当你删除所有组时,引擎将收取选择任何id和内容的费用,但只收取最高版本的费用。@tadman新设置的作用正好相反,它要求聚合函数使用
groupby
@tadman Ok,所以这只是我的MySQL对我的严格要求。谢谢这不是新版本所要求的。使用
分组依据
时禁止非聚合列,使用聚合时不要求
分组依据
。聚合整个表是标准SQL。@Barmar混合聚合列引用和非聚合列引用不是标准SQL
MAX()
是聚合。@Barmar yes
MAX
是聚合,但他们也选择非聚合列
id
content
我理解这一点。但我认为这与MySQL版本无关。
ONLY\u FULL\u GROUP\u BY
SQL模式仅影响使用
groupby
时所允许的内容。谢谢,非常感谢。我相信您的答案与Easton Bornemeier的答案类似。@xQbert通常最好只指定一个组,如果可能的话,使用主键,以确保获得整行:)我喜欢这方面的文档:“在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的。此外,添加ORDERBY子句不会影响从每个组中选择值“这解释得很好:@EasttonbornemeierBooo!!!当您完全理解mySQL扩展时,使用mySQL扩展的机会可以带来性能提升!例如,如果我知道未按列分组的所有值都是相同的,那么引擎没有将它们分组的开销,并且picking one也不重要。因为引擎不必分组,所以开销就减少了。这是一个有目的的特点;但很少正确使用;因此,更改默认值的原因。(更新答案最后一行的结束评论)上述评论仅用于信息和喜剧目的。任何煽动或伤害@EastonBornemeier的意图纯属无心。。。干杯缺少由…组成的组。。。更像是mySQL如何通过noooooooo扩展标准组……:很高兴这里的人有幽默感。。。即使它比我的更扭曲。