2015-09-30 23 views
1

我已经根据列字段为我的表分组,并同时显示每个组的计数值。 例如在sql查询中返回前3个计数值

user | count(user) 
user 1 |  4 
user 2 |  3 
user 3 |  3 
user 4 |  3 
user 5 |  2 

现在我需要只显示前3用户计数4.

我已经写分组逻辑这种情况下用户1,用户2,用户3,用户但当我尝试订购然后将结果限制为3(限制3),我只得到用户1,2和3.这是不正确的,因为用户4也进入前3计数。

+0

请测试它:SELECT'user',COUNT('user')FROM'table' GROUP BY'user' HAVING MAX COUNT('用户') –

+1

这是[标签:mysql]还是[标签:sqlite]? – Mureinik

回答

1

首先用独立确定临界值选择这将是(用于MySQL的)更容易:

SELECT MIN(cnt) 
INTO @min 
FROM (
    SELECT COUNT(*) cnt 
    FROM Table 
    GROUP BY user 
    ORDER BY cnt DESC 
    LIMIT 3 
) t; 

SELECT user, COUNT(*) usercount 
FROM Table 
GROUP BY user 
HAVING usercount>= @min 
ORDER BY usercount DESC; 

另见http://sqlfiddle.com/#!9/6d749/2

1

这应做到:

选择用户,计数(1)来自用户组,具有计数(用户)> =(从用户组中选择计数(1)按用户顺序计数(用户)限制2,1 )按次数(用户)

Example table: 
mysql> select * from users; 
+----+-------+ 
| id | user | 
+----+-------+ 
| 1 | user1 | 
| 3 | user3 | 
| 4 | user4 | 
| 5 | user5 | 
| 6 | user1 | 
| 7 | user2 | 
| 8 | user2 | 
| 9 | user2 | 
| 10 | user2 | 
| 11 | user1 | 
| 12 | user5 | 
| 13 | user5 | 
| 14 | user6 | 
| 15 | user6 | 
| 16 | user6 | 
+----+-------+ 
15 rows in set (0.00 sec) 


mysql> select user, count(1) from users group by user having count(user) >= (select count(1) from users group by user order by count(user) desc limit 2, 1) order by count(user) desc; 
+-------+----------+ 
| user | count(1) | 
+-------+----------+ 
| user2 |  4 | 
| user1 |  3 | 
| user5 |  3 | 
| user6 |  3 | 
+-------+----------+ 
4 rows in set (0.00 sec) 

所以诀窍是弄清楚第三最高计数值是什么。然后获得所有具有> =的计数的用户(因此它包括并列第三名的用户)。

带有LIMIT 2,1的子查询用于获取第三高的计数值。所以你可以使用限制4,1如果你想要5而不是3。