返回sql查询中的前3个计数值

时间:2015-09-30 20:11:36

标签: mysql sqlite

我根据列字段对表格进行了分组,同时显示了每个组的计数值。 例如

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

现在我只需显示前3位用户数,例如用户1,用户2,用户3,用户4。

我已经编写了分组逻辑但是当我尝试通过desc命令count值然后将结果限制为3(Limit 3)时,我只得到用户1,2和3.这是不正确的因为用户4也排在前3位。

2 个答案:

答案 0 :(得分: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)> =(按用户顺序从用户组中选择count(1)按计数(用户)desc limit 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的子查询用于获得第3个最高计数值。所以你可以使用LIMIT 4,1如果你想要5而不是3。