【问题标题】:Get user rank with MySQL使用 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)。

非常感谢!

【问题讨论】:

  • “找不到解决方案”是什么意思?您是否在寻找“要执行的代码”?
  • 是的,我正在寻找代码。我在其他 Stackoverflow 指南的帮助下尝试了一些事情,但我无法让它工作:-(

标签: mysql ranking


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2021-09-13
        • 2012-12-28
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多