8

你好,

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

我有下表。

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/18

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

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

6 回答 6

5

只需计算有多少人比他们有更多的积分。

select count(1) from users 
where point > (select point from users where id = 2) group by point

这将为您提供对给定用户拥有更多积分的人数。因此,对于用户 1 和用户 2,结果将为 0(零),表示他们是第一个。

于 2011-03-18T03:02:51.710 回答
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;
于 2011-03-18T03:36:13.257 回答
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的rank,或者任意rank对应的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 个实体要排名,所以这对我来说已经足够好了。但是,如果您可能有大量行,您可能希望考虑使用此处介绍的其他解决方案之一或限制排名范围。

于 2011-03-18T03:18:29.600 回答
2

如果之前是具有相同等级的重复点,则 OP 希望跳过等级编号。例如,下面看看 2 是如何被跳过的,因为 rank 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;
于 2012-08-04T21:37:10.710 回答
0

在 mysql 8 中,您可以使用如下窗口函数

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 = ?
于 2019-07-22T04:03:00.647 回答
-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;

表:用户

于 2011-03-18T03:25:51.847 回答