按降序排序并返回用于排名的记录号
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,它不需要别名。我已经修复了这个例子。以上是关于按降序排序并返回用于排名的记录号的主要内容,如果未能解决你的问题,请参考以下文章
在c中使用多维数组存储来自用户的一行,并根据字长按降序返回该行中的单词