何时聚合函数需要GROUP BY?

时间:2016-06-26 16:03:33

标签: mysql group-by aggregate-functions

我有一个名为myEntity的表格如下:

- id (PK INT NOT NULL)
- account_id (FK INT NOT NULL)
- key (INT NOT NULL.  UNIQUE for given account_id)
- name (VARCHAR NOT NULL.  UNIQUE FOR given account_id)

我不希望将主键id公开给用户,并为此目的添加了keykey类似于给定accounts_id的自动增量列,需要由应用程序手动完成。我第一次计划制作主键复合id-account_id,然而,表已连接到其他表,在我知道它之前,我在表中有四列可能是一列。虽然account_id-nameaccount_id-key的作用相同,但key较小,并且会在客户端请求多条记录时将网络流量降至最低。是的,我知道它没有得到正确的规范化,虽然不是我的直接问题,但我会感谢任何建设性的批评意见。

抱歉漫无目的...群集功能何时需要GROUP BY?例如,以下怎么样? https://stackoverflow.com/a/1547128/1032531没有显示一个。需要吗?

SELECT COALESCE(MAX(key),0)+1 FROM myEntity WHERE accounts_id=123;

2 个答案:

答案 0 :(得分:2)

您提供的查询是一个不需要GROUP BY的示例。为了便于解释,我将简化如下。

SELECT MAX(key)
  FROM myEntity
 WHERE accounts_id = 123

为什么该查询不需要GROUP BY?因为您只希望结果集中有一行,描述特定帐户。

如果您希望结果集描述每个帐户一行的所有帐户,该怎么办?然后你会用这个:

 SELECT accounts_id, MAX(key)
   FROM myEntity
  GROUP BY accounts_id

看看怎么样?对于accounts_id的每个不同值,您在此结果集中获得一行。顺便说一句,MySQL的查询规划器知道

 SELECT accounts_id, MAX(key)
   FROM myEntity
  WHERE accounts_id = '123'
  GROUP BY accounts_id

等同于省略GROUP BY子句的相同查询。

还有一件事需要知道:如果您的表中(accounts_id, key)上有一个复合索引,那么所有这些查询几乎都会奇迹般快,因为查询规划器会以非常高效的loose index scan.来满足它们。特定于MAX()MIN()聚合函数。松散的索引扫描不能用于SUM()AVG()或类似功能;那些需要严密的索引扫描。

答案 1 :(得分:0)

只有在您需要它时才需要它。例如,如果要返回所有键,可以使用

SELECT COALESCE(MAX(key),0)+1来自myEntity GROUP BY accounts_id

而不是你的选择。但你的选择很好(虽然看起来你的结构可能让你自己的事情变得有些困难,但我不知道你试图解决的问题)