如何获得排名?

时间:2011-03-18 02:55:14

标签: mysql rank

HI,

我昨天实际上发布了类似(或相同?)的问题,但我认为我需要发布一个新问题,因为我的问题很短但很明显。

我有下表。

id  point
1   30
2   30
3   29
4   27
5   28
6   26

我想要的是什么:

  1. 按排名获取所有用户的排序。用户#1和#2应该有1作为他们的排名值,因为他们都有30分

  2. 我想按用户ID查询排名。当我查询用户#1和#2时我喜欢得到1,因为他们都有30分

  3. 添加于:3/18

    我尝试了Logan的查询,但得到了以下结果

    id point   rank
    1   30  1
    2   30  1
    3   29  3
    4   27  5
    5   28  4
    6   26  6
    

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;

表:用户