mysql - 有聚合函数为什么还要把其余的列写到GROUP BY中呢?

标签 mysql group-by aggregate-functions

我有这个表结构:

// mytable
+----+------+-------+-------------+
| id | type | score |  unix_time  |
+----+------+-------+-------------+
| 1  | 1    | 5     | 1463508841  |
| 2  | 1    | 10    | 1463508842  |
| 3  | 2    | 5     | 1463508843  |
| 4  | 1    | 5     | 1463508844  |
| 5  | 2    | 15    | 1463508845  |
| 6  | 1    | 10    | 1463508846  |
+----+------+-------+-------------+

这是我的查询:

SELECT SUM(score), unix_time
FROM mytable
WHERE 1
GROUP BY type

这是输出:

+-------+-------------+
| score |  unix_time  |
+-------+-------------+
| 30    | 1463508841  |
| 20    | 1463508843  |
+-------+-------------+

Ok,一切都很好.. 只是有一件事:专业人士建议我将unix_time 写入GROUP BY。他们认为这样做是分组和聚合功能的基础。

那么,为什么我真的应该在 GROUP BY 中写入一个(几乎) 唯一列?如果我这样做,那么每一行将是一个单独的组,并且会有很多额外的无用行:

+-------+-------------+
| score |  unix_time  |
+-------+-------------+
| 30    | 1463508841  |
| 30    | 1463508842  |
| 20    | 1463508843  |
| 30    | 1463508844  |
| 20    | 1463508845  |
| 30    | 1463508846  |
+-------+-------------+

看到了吗?有很多额外的行。那么为什么这样做是标准的事情呢?为什么每个人都告诉我 MySQL 不这样做也能工作,但没有其他数据库不能..我真的不明白为什么我应该这样做..!

请有人帮我说清楚并解释一下 GROUP BY 是如何工作的?这和我的理解不一样吗?

最佳答案

GROUP BY 子句中没有 unix_time 是一种非标准的 MySQL hack,我会完全远离它。 unix_type 的值在具有相同类型的所有行中完全不同。你怎么知道应该出现哪个 unix_time

在您的示例中,您似乎非常满意每组使用完全任意的 unix_time 值。

然而,这是灾难的根源。从一组中选择一些完全任意的值甚至意味着什么?如果 unix_times 按天、周甚至年展开怎么办?那你会选择哪一个?

专业人士告诉您将其放在 group by 子句中的原因是为了使结果有意义!另一种方法是将 unix_time 完全排除在选择之外,因为不应该依赖您得到的结果。

关于mysql - 有聚合函数为什么还要把其余的列写到GROUP BY中呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37534694/

相关文章:

php - Mysql实时数据库迁移/转换

php/mysql - 多个文件上传没有正确插入到表中

mysql group by 具有重复值和计数

MySQL 查询 : I want to use aggregate function between two tables?

postgresql - 使用多表子句将多个行值选择为单行

sql - 按月计算的累计值,填补缺失的月份

mysql:在大树中组织搜索

mysql - 社区版不支持内置加密,如何加密MySQL备份文件?

'group_by' 使用的 Ruby 比较

asp.net - 使用 GroupBy Id 选择 ASP NET CORE Entity Framework