我有下表:
+------+-------+--------------------------------------+
| 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上获得了上述结果,没有自定义/配置。
答案 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没有分组。