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文档承认允许一个有误导性的有问题的非标准查询的方式……它也曾让我(几年前)!:)我以前也被它绊倒过一次(几年前)!:)