HI,
我昨天实际上发布了类似(或相同?)的问题,但我认为我需要发布一个新问题,因为我的问题很短但很明显。
我有下表。
id point
1 30
2 30
3 29
4 27
5 28
6 26
我想要的是什么:
按排名获取所有用户的排序。用户#1和#2应该有1作为他们的排名值,因为他们都有30分
我想按用户ID查询排名。当我查询用户#1和#2时我喜欢得到1,因为他们都有30分
添加于:3/18
我尝试了Logan的查询,但得到了以下结果
id point rank
1 30 1
2 30 1
3 29 3
4 27 5
5 28 4
6 26 6
答案 0 :(得分:5)
您推荐的子查询方法将按比例缩放。 http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/显示了一种更有效的用户变量方法。以下是对您的问题的未经测试的修改:
@points := -1; // Should be an impossible value.
@num := 0;
SELECT id
, points
, @num := if(@points = points, @num, @num + 1) as point_rank
, @points := points as dummy
FROM `users`
ORDER BY points desc, id asc;
答案 1 :(得分:4)
算一下有多少人拥有更多积分。
select count(1) from users
where point > (select point from users where id = 2) group by point
这将为您提供给定用户拥有更多积分的人数。因此对于用户1和用户2,结果将为0(零),这意味着它们是第一个。
答案 2 :(得分:2)
当我需要做类似的事情时,我创建了一个看起来像这样的视图:
CREATE VIEW rankings_view
AS
SELECT id
, point
, (select count(1)
from points b
where b.point > a.point) +1 as rank
FROM points as a;
这假设原始表显然是命名点。然后,您可以通过查询视图来获取任何ID的等级或对应于任何等级的ID。
编辑
如果要计算每个点值之上的不同点值的数量,而不是点值高于当前点值的条目数,则可以执行以下操作:
CREATE VIEW rankings_view2
AS
SELECT id
, point
, (SELECT COUNT(1) +1 AS rank
FROM ( SELECT DISTINCT point
FROM points b
WHERE b.point >a.point ))
FROM points AS a;
请注意
其他一些解决方案肯定比这个更好。它们是特定于mysql的,因此我无法真正将它们用于我正在做的事情。我的应用程序最多有128个实体排名,所以这对我来说效果很好。但是,如果您可能有大量行,则可能需要查看使用此处提供的其他解决方案或限制排名范围。
答案 3 :(得分:2)
如果OP之前是具有相同排名的重复点,则OP希望跳过排名。例如。下面看看如何跳过2,因为等级1出现两次。
id point rank
1 30 1
2 30 1
3 29 3
4 27 4
5 28 5
6 26 6
这可以通过修改btilly的代码来实现,如下所示:
set @points := -1; // Should be an impossible value.
set @num := 0;
set @c := 1;
SELECT id
, points
, @num := if(@points = points, @num, @num + @c) as point_rank
, @c := if(@points = points, @c+1, 1) as dummy
, @points := points as dummy2
FROM `users`
ORDER BY points desc, id asc;
答案 4 :(得分:0)
在mysql 8中,您可以像这样使用window function:
SELECT
id,
score,
rank() over (order by amount) as ranking
FROM
SomeTable
如果您只需要选择一行行,请使用子查询:
SELECT
id
score,
ranking
FROM (
SELECT
id,
score,
rank() over (order by score) as ranking
FROM
SomeTable
) t
WHERE
id = ?
答案 5 :(得分:-1)
SET @rank = 0, @prev_val = NULL;
SELECT id, @rank := IF(@prev_val=points,@rank,@rank+1) AS rank,
@prev_val := points AS points FROM users ORDER BY points DESC, id asc;
表:用户