我想使用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
非常感谢任何帮助。
答案 0 :(得分:5)
LIMIT
旨在限制您从查询中获得的行数。我建议您使用COUNT
函数,如下所示:
SELECT id, CASE WHEN COUNT(*) < 6 then COUNT(*) ELSE '5+' END as 'hits'
FROM tbhits
GROUP BY id
有关选择至少两个数字here和here 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获得解决方案,则必须使用IF
或CASE
语句。否则请与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