我想限制组内记录的大小,这是我的试用版,如何做到对不对?
mysql> select * from accounts limit 5 group by type;
错误1064(42000):您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本 在第1行的'group by type'附近使用正确的语法
答案 0 :(得分:5)
聚合函数(以及它需要的GROUP BY)的要点是将许多行转换为一行。因此,如果您真的只想要前5个储蓄账户和前5个支票账户以及前5个美元账户等,您需要的更像是:
标准:account_balance
中特定帐户类型的前5位SELECT account_type, account_balance FROM accounts WHERE account_type='savings'
ORDER BY account_balance DESC LIMIT 5
UNION
SELECT account_type, account_balance FROM accounts WHERE account_type='chequing'
ORDER BY account_balance DESC LIMIT 5
UNION
SELECT account_type, account_balance FROM accounts WHERE account_type='USD'
ORDER BY account_balance DESC LIMIT 5;
它并不漂亮,但如果您使用脚本构造SQL,那么在account_types中进行子搜索并将查询连接在一起就很简单。
答案 1 :(得分:1)
尝试在GROUP BY子句之后放置LIMIT子句。
编辑:试试这个:
SELECT *
FROM accounts a1
WHERE 5 >
(
SELECT COUNT(*)
FROM accounts a2
WHERE a2.type = a1.type
AND a2.balance > a1.balance
)
每个类型最多返回5个余额最多的帐户。
答案 2 :(得分:1)
您似乎希望限制整个结果集的每个组中返回的行数...这很难以可扩展的方式进行。一种技术是在同一个表上执行N个连接,其条件是匹配的唯一行是您想要的顶部/底部N.
this page可能会为您的解决方案提供一些额外的见解......虽然返回每组中的前5名会很快变得难看。
答案 3 :(得分:0)
分组依据用于聚合函数(总和,平均值......)
允许您将聚合结果拆分为组。您尚未使用其中一项功能。
答案 4 :(得分:0)
我不确定您是否可以在组中使用限制。如果你的group by是一个返回一行/值的子选择,你可以使用它。例如:
从foo order by中选择*(从foo2 limit 1中选择foo2.id)
我只是猜测这会奏效。
答案 5 :(得分:0)
这可能会有所帮助,但如果type
没有编入索引,那么它将是 sloooowwww 。即使只有一个,它也不是特别快:
SELECT a.*
FROM accounts a
LEFT JOIN accounts a2 ON (a2.type = a.type AND a2.id < a.id)
WHERE count(a2.id) < 5
GROUP BY a.id;
更好的选择是order
只列出type
列表,然后在业务层使用循环删除您不想要的行。
答案 6 :(得分:0)
@ dnagirl的回答差不多了,但由于某种原因,我的MySQL版本只返回第一个LIMIT&#39; d。为了解决这个问题,我将每个语句放入子查询
SELECT * FROM (
SELECT account_type, account_balance FROM accounts WHERE account_type='savings'
ORDER BY account_balance DESC LIMIT 5
) as a
UNION
SELECT* FROM (
SELECT account_type, account_balance FROM accounts WHERE account_type='chequing'
ORDER BY account_balance DESC LIMIT 5
) as b
UNION
SELECT * FROM (
SELECT account_type, account_balance FROM accounts WHERE account_type='USD'
ORDER BY account_balance DESC LIMIT 5
) as c
这让我回到了最终结果集中的每一组结果。否则,我只会从第一个查询中获得前5个而不是其他任何内容 - 不确定它是否只是我的版本的一些MySQL funk