我根据列字段对表格进行了分组,同时显示了每个组的计数值。 例如
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位。
答案 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;
答案 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。