我有这个表结构:
// 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/