Mysql 当存在聚合函数时,为什么要将其余列写入GROUP BY?
我有以下表格结构:Mysql 当存在聚合函数时,为什么要将其余列写入GROUP BY?,mysql,group-by,aggregate-functions,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 |
// 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 |
+-------+-------------+
好的,很好。。只是有一件事:专业人士建议我将unix\u time
写入groupby
。他们认为这样做是分组和聚合功能的基础
那么,为什么我真的要在groupby
中写一个(几乎)唯一的列呢?如果我这样做,那么每一行都将是一个单独的组,并且会有很多无用的额外行:
+-------+-------------+
| score | unix_time |
+-------+-------------+
| 30 | 1463508841 |
| 30 | 1463508842 |
| 20 | 1463508843 |
| 30 | 1463508844 |
| 20 | 1463508845 |
| 30 | 1463508846 |
+-------+-------------+
看到了吗?有很多额外的行。那么为什么这样做是一件标准的事情呢?为什么每个人都告诉我MySQL不做这些就可以工作,但是没有其他数据库不能。。嗯,我真的不明白我为什么要那样做
请有人给我解释清楚,
groupby
是如何工作的?这与我的理解不同吗?也许你需要这样的东西:
SELECT type,
SUM(score) as sum_of_score,
MIN(unix_time) as start_unix_time,
MAX(unix_time) as end_unix_time
FROM mytable
WHERE 1
GROUP BY type
也许你需要这样的东西:
SELECT type,
SUM(score) as sum_of_score,
MIN(unix_time) as start_unix_time,
MAX(unix_time) as end_unix_time
FROM mytable
WHERE 1
GROUP BY type
在
groupby
子句中没有unix\u time
,这是一种非标准的MySQL黑客行为,我将完全远离它。同一类型的所有行中的unix_type的值完全不同。您如何知道应该显示哪个时间
在您的示例中,您似乎完全满足于对每个组使用完全任意的unix\u time
然而,这是一个灾难的秘诀。甚至从一个组中挑选一些完全任意的值意味着什么?如果unix_时代以天、周甚至几年为单位展开会怎样?那你要哪一个
专业人士告诉你把它放在GROUPBY子句中的原因是为了让结果有意义!另一种方法是将
unix\u-time
完全排除在select之外,因为您得到的结果不应该被依赖。在GROUP BY
子句中没有unix\u-time
是一种非标准的MySQL攻击,我将完全避免。同一类型的所有行中的unix_type的值完全不同。您如何知道应该显示哪个时间
在您的示例中,您似乎完全满足于对每个组使用完全任意的unix\u time
然而,这是一个灾难的秘诀。甚至从一个组中挑选一些完全任意的值意味着什么?如果unix_时代以天、周甚至几年为单位展开会怎样?那你要哪一个
专业人士告诉你把它放在GROUPBY子句中的原因是为了让结果有意义!另一种方法是将
unix\u time
完全排除在选择之外,因为您得到的结果不应该被依赖。手册中对此进行了明确解释:最好阅读链接到的@jpw页面。请注意重要的一行:“在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的。”我喜欢MySQL文档承认允许一个有误导性的、有问题的非标准查询……手册中对此进行了明确解释:最好阅读@jpw链接到的页面。请注意重要的一行:“在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则所选择的值是不确定的,这可能不是您想要的。”我喜欢MySQL文档承认允许一个有误导性的有问题的非标准查询的方式……它也曾让我(几年前)!:)我以前也被它绊倒过一次(几年前)!:)