我有一个名为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
公开给用户,并为此目的添加了key
。 key
类似于给定accounts_id
的自动增量列,需要由应用程序手动完成。我第一次计划制作主键复合id-account_id
,然而,表已连接到其他表,在我知道它之前,我在表中有四列可能是一列。虽然account_id-name
与account_id-key
的作用相同,但key
较小,并且会在客户端请求多条记录时将网络流量降至最低。是的,我知道它没有得到正确的规范化,虽然不是我的直接问题,但我会感谢任何建设性的批评意见。
抱歉漫无目的...群集功能何时需要GROUP BY?例如,以下怎么样? https://stackoverflow.com/a/1547128/1032531没有显示一个。需要吗?
SELECT COALESCE(MAX(key),0)+1 FROM myEntity WHERE accounts_id=123;
答案 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
而不是你的选择。但你的选择很好(虽然看起来你的结构可能让你自己的事情变得有些困难,但我不知道你试图解决的问题)