使用 MySQL 获取用户排名

Posted

技术标签:

【中文标题】使用 MySQL 获取用户排名【英文标题】:Get user rank with MySQL 【发布时间】:2012-04-28 12:14:00 【问题描述】:

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

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

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

在页面顶部设置了变量 $user_id。比如user_id是4。现在我想通过积分来获取用户的排名(如果user_id是4,输出应该是1)。

非常感谢!

【问题讨论】:

“找不到解决方案”是什么意思?您是否在寻找“要执行的代码”? 这是你要找的***.com/questions/3614666/… 是的,我正在寻找代码。我在其他 *** 指南的帮助下尝试了一些事情,但我无法让它工作:-( 【参考方案1】:
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

【讨论】:

【参考方案2】:

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

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;

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

非常感谢。但是我应该怎么做:进行 MySQL 查询或在 for 循环中使用 php 进行检查?我的意思是:如果有超过 40.000 个用户,什么会更快? 我更新了一点。除非你的桌子很小,否则你必须保持排名。 好的,你的意思是我应该将排名存储在表格中?而且我不应该在排名页面上计算它? 是的。您应该分别处理计算(例如,当您更改值或批量更改值时)和显示。因为所有基于 sql 的计算都很慢。 这个不需要变量。【参考方案4】:

已经有a simple solution,正好适合你的目的。

【讨论】:

很确定他没有要求 php 代码,他甚至没有提到 php。 不知道哪个更好更快? PHP 还是 MySQL? 我只是在诱导以下行:On the top of the page the variable $user_id is set. 他在我的回答中提到了 cmets 中的 PHP,所以这可能确实让他感兴趣。无需投票。【参考方案5】:

这可能会有所帮助

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

【讨论】:

以上是关于使用 MySQL 获取用户排名的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中获取这个特定的用户排名查询?

MySQL实现排名查询并指定用户查看排名

MySQL实现排名查询并指定用户查看排名

根据 MySQL 数据库中的点数获取用户排名

Mysql 使用过滤器获取排名

mysql使用rownum方式,实现部门排名和公司排名