组内的mysql限制?

时间:2009-07-20 13:57:11

标签: mysql sql

我想限制组内记录的大小,这是我的试用版,如何做到对不对?

mysql> select * from accounts limit 5 group by type;
  

错误1064(42000):您的SQL语法有错误;检查手册                           对应于您的MySQL服务器版本                           在第1行的'group by type'附近使用正确的语法

7 个答案:

答案 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