9

我阅读了许多有关此问题的主题,但找不到解决方案。

我有一个包含我网站用户的表(称为用户)。他们有积分。例如:

+-----------+------------+
| User_id   | Points     |
+-----------+------------+
| 1         | 12258      |
| 2         | 112        |
| 3         | 9678       |
| 4         | 689206     |
| 5         | 1868       |
+-----------+------------+

在页面顶部设置了变量 $user_id。例如 user_id 为 4。现在我想按点获取用户的排名(如果 user_id 为 4,则输出应为 1)。

非常感谢你!

4

5 回答 5

15
SELECT 
    COUNT(*) AS rank 
FROM users 
WHERE Points>=(SELECT Points FROM users WHERE User_id=4)

更新了一些更有用的东西:

SELECT 
    user_id, 
    points, 
    (SELECT COUNT(*)+1 FROM users WHERE Points>x.points) AS rank_upper, 
    (SELECT COUNT(*) FROM users WHERE Points>=x.points) AS rank_lower 
FROM 
    `users` x 
WHERE x.user_id = 4

其中包括用户所在的等级范围。例如,如果前五名的分数是 5 4 3 3 3,那么结果将是:

id points rank_upper rank_lower
id 5      1          1
id 4      2          2
id 3      3          5
id 3      3          5
id 3      3          5
于 2012-04-28T12:20:40.253 回答
1

这个查询应该做你想做的事:

SELECT rank FROM (
   SELECT User_id, Points,
          FIND_IN_SET(
                Points,
                   (SELECT  GROUP_CONCAT(
                           DISTINCT Points 
                            ORDER BY Points   DESC
                        )
               FROM    users)
            ) as rank
    FROM   users )
WHERE User_id = 4;
于 2012-04-28T12:20:01.003 回答
0

如果您不想在 mysql 之外执行此操作,则需要使用变量来计算排名。

这是一个准确描述您想要的解决方案:

http://www.fromdual.ch/ranking-mysql-results

您仍然需要,您希望直接为每条记录拥有它,将其存储在记录中并自行更新。没有任何合理的查询可以直接为您提供排名,而无需在真实表上存储(我的意思是不只是几百条记录)。

于 2012-04-28T12:17:03.173 回答
0

已经有一个简单的解决方案,适合您的目的。

于 2012-04-28T12:20:55.263 回答
0

这可能会有所帮助

SELECT @rank:=@rank+1 AS rank,`User_id`,`Points` FROM `users` u JOIN (SELECT @rank:=0) r ORDER BY u.Points DESC
于 2013-10-09T12:13:56.887 回答