按降序排序并返回用于排名的记录号

Posted

技术标签:

【中文标题】按降序排序并返回用于排名的记录号【英文标题】: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 也可以。

【问题讨论】:

【参考方案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,它不需要别名。我已经修复了这个例子。

以上是关于按降序排序并返回用于排名的记录号的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - 按值按降序排序哈希值

在c中使用多维数组存储来自用户的一行,并根据字长按降序返回该行中的单词

SQL查询结果加入排序值的问题

如何按值按降序对哈希进行排序并在 ruby​​ 中输出哈希?

求一条sql语句,按照成绩降序排序,并显示名次,如123

对表格进行数字排序并获取列表编号