使用GROUP BY限制计数

时间:2014-05-14 15:53:40

标签: mysql sql

我想使用COUNT(*)group by将计数限制为5,但它会返回所有行。考虑我有一个表名tbhits

         tbhits

     id    |     uname
 ------------------------
    101    |      john
    101    |      james
    101    |      henry
    101    |      paul
    101    |      jacob
    101    |      jaden
    101    |      steve
    101    |      lucas
    102    |      marie

SELECT id,COUNT(*)as' hits' FROM tbhits GROUP BY id

返回

     id    |   hits
 --------------------
     101   |    8
     102   |    1

但我希望小组将最大数量限制为5。

假设我有1000行,我不想全部计算,如果行只是大于5,那么只显示5+

我尝试使用LIMIT 5,但它似乎无法正常工作

SELECT id,COUNT(*) as 'hits' FROM tbhits GROUP BY id LIMIT 5不起作用。

我还使用了WHERE Clause

SELECT id,COUNT(*)as' hits' FROM tbhits WHERE id = 101 GROUP BY id LIMIT 5

但是stil将命中返回为8.

          id    |   hits
        --------------------
          101   |    8

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

LIMIT旨在限制您从查询中获得的行数。我建议您使用COUNT函数,如下所示:

SELECT id, CASE WHEN COUNT(*) < 6 then COUNT(*) ELSE '5+' END as 'hits' 
FROM tbhits 
GROUP BY id

有关选择至少两个数字herehere goes the sqlfiddle的详细信息(请考虑下次自己提供)。

请注意,我去了6而不是&#39; 5 +&#39;在我的第一个建议中,因为在我看来,你不应该混合数据类型。但是输入6也不是一个好的解决方案,因为不知道这个技巧的人不会注意到它(&#39; 5 +&#39;,至少,是明确的)

就性能而言,AFAIK你不应该指望MySQL自己进行优化。

答案 1 :(得分:2)

GROUP BY子句上的LIMIT实际上不会限制计数,它会限制输出的行。

尝试使用if语句来比较计数结果

SELECT id,if(COUNT(*)>5,'5+',COUNT(*)) as 'hits'
FROM tbhits 
GROUP BY id 

O / P:

     id    |   hits
 --------------------
     101   |    5+
     102   |    1

关于性能问题,AFAIK GROUP BY将始终导致降低性能,并且没有直接方式来限制GROUP BY子句中的计数。如果您想从MySQL获得解决方案,则必须使用IFCASE语句。否则请与PHP本身一起使用。

此外,您应该查看GROUP BY optimization

答案 2 :(得分:0)

试试这个吗?

SELECT id,COUNT(*) as 'hits' FROM tbhits GROUP BY id 
HAVING hits >= 5

答案 3 :(得分:0)

正如已经说过的LIMIT在这种情况下最后适用,因此在分组之后。您要做的是修改分组完成后选择的值。

这将适当地输出&#34; 5 +&#34;如果你的桌子记录超过5条。

SELECT id, 
  IF(COUNT(*)>5,"5+",COUNT(*)) AS 'count'
FROM Whatever GROUP BY id

请在此处查看SQL小提琴: http://sqlfiddle.com/#!2/e381e/4