获得MySQL的用户排名

时间:2012-04-28 12:14:01

标签: mysql ranking

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

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

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

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

非常感谢!

5 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分: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;

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

已经a simple solution,只适合您的目的。

答案 4 :(得分:0)

这可能会有所帮助

SELECT @rank:=@rank+1 AS rank,`User_id`,`Points` FROM `users` u JOIN (SELECT @rank:=0) r ORDER BY u.Points DESC