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

时间:2013-12-05 23:18:24

标签: php mysql sql-order-by ranking

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

SELECT * FROM users ORDER BY reputation DESC 

这会让我按最高声望订购的用户最低。假设用户Tim显示为第3条记录。 如何返回他按顺序排列的#记录,即他的排名?这看起来很简单,但我在如何做到这一点上空白了。基本上我想在订购后记录#“说他是第三名的用户”。或者,这是否是错误的排名方式?

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

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

2 个答案:

答案 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