【问题标题】:Order by descending and returning the record number to use for ranking按降序排序并返回用于排名的记录号
【发布时间】:2013-12-05 23:18:24
【问题描述】:

我试图通过他们的声誉非常简单地对用户进行排名,该声誉存储为 MySQL 用户表中的 int 列。为了从最高到最低找出哪些用户的声誉最高,我会这样做:

SELECT * FROM users ORDER BY reputation DESC 

这将使我的用户按最高信誉排序到最低。假设用户 Tim 显示为第三条记录。 我如何返回他在该顺序中的哪条记录,即他的等级?这看起来很简单,但我在如何做到这一点上画了一个空白。本质上我想要记录 # 在命令说“他是第三高声誉的用户”之后。或者,这是进行排名的错误方式吗?

我可以通过user_id 列在users 中指定一个用户,如果可能的话,我只想在一个查询中返回用户的排名。

如果有人知道使用它的快捷方式,我将使用 Laravel 作为框架,但通常使用 SQL 也可以。

【问题讨论】:

    标签: php mysql sql-order-by ranking


    【解决方案1】:

    你在寻找这样的东西吗?

    set @rank:= 0;
    
    SELECT (@rank:= @rank+ 1) AS Rank , users.* FROM users ORDER BY reputation DESC;
    

    这将为每个结果记录增加@rank。 对于特定用户使用:

    SELECT T.reprank 
    FROM   (SELECT @rank := @rank + 1 AS reprank, 
                   users.* 
            FROM   users, 
                   (SELECT @rank := 0) rnk 
            ORDER  BY reputation DESC) AS T 
    WHERE  id = 23 
    

    【讨论】:

    • 我不确定.. 那有什么作用?我基本上只想在用户的用户名旁边显示他们的排名,由他们的声誉决定(即,如果他们有第三高的声誉,他们就是#3)。我认为这会非常简单,但我被卡住了。
    • 现在试试,我忘记了选择表名,这应该可以工作
    • 我如何返回排名?这是我唯一感兴趣的部分。我希望运行一个返回 # 排名的查询,该排名是通过降低声誉来计算的。
    • 这将创建一个包含每个人排名的排名列。试试吧,你会看到这样你就可以通过 id 返回用户的排名。
    • 您可以仅添加 SELECT Rank 并添加 WHERE user_id=2 例如这将返回用户 2 的排名
    【解决方案2】:

    这类似于 Sam D 的答案,但它将所有内容都放在一个查询中:

    SELECT
      @rank := @rank + 1 AS RepRank,
      users.*
    FROM users, (SELECT @rank := 0) rnk
    ORDER BY reputation DESC;
    

    要将结果限制为特定用户,您需要进行外部查询 - 确实没有办法绕过它。方法如下(请注意,内部查询与上面显示的查询相同):

    SELECT * FROM (
      SELECT
        @rank := @rank + 1 AS RepRank,
        users.*
      FROM users, (SELECT @rank := 0) rnk
      ORDER BY reputation DESC
    ) RankedUsers
    WHERE User_ID = 5
    

    【讨论】:

    • 我怎样才能在该查询中返回具有user_id = 5 排名的用户?这就是我要找的。​​span>
    • 你必须先计算排名,然后你可以继续选择User_ID=5。您可以通过使用外部查询围绕排名查询来做到这一点。我已经用一个例子更新了我的答案。
    • 这还是有错误,每个派生表都需要有别名。否则,完美。
    • 很好,谢谢!我最近大部分时间都在做 Oracle,它不需要别名。我已经修复了这个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2018-06-21
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多