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

时间:2017-08-08 19:48:41

标签: mysql sql greatest-n-per-group

我有下表:

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+

当我运行以下查询时:

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

我明白了:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
| 2    |    1     | ...                                  |
+------+----------+--------------------------------------+

但是如果我删除GROUP BY子句如下:

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

我明白了:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
+------+----------+--------------------------------------+

这对我来说是违反直觉的,因为期望GROUP BY会通过消除重复值来减少结果数量。但是,在上述情况下,GROUP BY的引入恰恰相反。这是因为MAX()函数,如果是,如何?

PS:该表基于此处的SO问题:SQL select only rows with max value on a column。我试图了解问题的answer,并在此过程中遇到了上述情况。

编辑:

我使用MySQL 5.6引擎在sqlfiddle.com上获得了上述结果,没有自定义/配置。

3 个答案:

答案 0 :(得分:3)

它正在使用您的MAX()函数,这取决于您的GROUP BY子句。因此,对于您的第一个查询,您说的是:为每个ID 提供最大转速,而第二个只是说给我一般的最大转速

感谢xQbert:

NOT 表示您在后一种情况下获得带有最大转速的。它将从选择中的任何位置获取值以用于您的id和内容字段。

您可以在此处详细了解SQL如何处理GROUP BY语句:Documentation

答案 1 :(得分:0)

这是因为你使用的是mysql 5.7的版本previuos ..这些版本允许使用聚合的d函数并且选择不在group by中的列...这对于非聚合列产生了不可预测的结果..在mysql 5.7中这不允许使用beahvior ...如果您选择未按组

中提及的聚合功能,则会出现错误

正确的sintax显然是第一个

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

答案 2 :(得分:0)

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

当你运行它时,因为表中有2个不同的id,你会在结果中得到两行,每个id带有一个最大值。 分组发生在id列上。

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

如果通过子句删除组,则结果中只有一行对应于整个表中的最大值。 ID没有分组