我试图通过他们的声誉非常简单地对用户进行排名,声誉在MySQL用户表中存储为int
列。为了找出哪些用户从最高到最低的声誉最高,我会做类似的事情:
SELECT * FROM users ORDER BY reputation DESC
这会让我按最高声望订购的用户最低。假设用户Tim
显示为第3条记录。 如何返回他按顺序排列的#记录,即他的排名?这看起来很简单,但我在如何做到这一点上空白了。基本上我想在订购后记录#“说他是第三名的用户”。或者,这是否是错误的排名方式?
我可以通过users
列在user_id
中指定用户,并且如果可能的话,主要想要在一个查询中返回用户的排名。
如果有人知道使用它的快捷方式,我使用Laravel作为框架,但通常只使用SQL也可以。
答案 0 :(得分:2)
你在找这样的东西吗?
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
答案 1 :(得分: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