Mysql - 如何在Order by之后获取行号?

use*_*071 7 php mysql

假设我有一个包含以下列的表:


P_ID

用户身份


假设这些列有超过5000条记录.所以我们实际上有用户点.每个用户的点记录都有一个唯一的行.想象一下,每个用户都可以点击某个地方在网站上获得积分.当他们点击时,我用他们得到的积分更新数据库.

所以我们有一张桌子,里面有5000多个有积分的记录,对吧?现在我想通过他们的点(降序)来命令它们,所以如果我运行MySQL查询,那么具有最多点的用户将位于页面的顶部.

我可以通过简单地运行这样的查询来做到这一点:

SELECT `p_id` FROM `point_table` ORDER BY `points` DESC
Run Code Online (Sandbox Code Playgroud)

此查询将按点按降序向我提供所有记录.

好的,这里我的问题来了,现在(当订购时)我想向每个用户显示它们实际上是哪个地方.所以我想给每个用户这样的话:"你是5374个用户中的623个".问题是我不能指定"623"号码.

我想运行一个查询,它按顺序对表进行 "搜索"或计算行号,在那里他们的记录是,然后将该值返回给我.

任何人都可以帮我如何为此建立一个查询?这将是一个非常大的帮助.谢谢.

spr*_*ain 13

这个答案对你有用:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, p_id FROM point_table ORDER BY points DESC;
Run Code Online (Sandbox Code Playgroud)

更新:您可能还需要考虑在更新点并将其保存到同一表中的其他列时计算排名.这样你也可以选择一个用户并知道他的排名.这取决于您的用例更有意义和更好的表现.

更新:我们在评论中制定的最终解决方案如下所示:

SELECT
rank, p_id
FROM
    (SELECT
     @rank:=@rank+1 AS rank, p_id, userid
     FROM
     point_table, (SELECT @rank := 0) r
     ORDER BY points DESC
    ) t
WHERE userid = intval($sessionuserid); 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但它实际上不起作用:/顺便说一下,那里的“r”和“t”是什么? (2认同)

小智 6

排序后的行号

SELECT ( @rank:=@rank + 1) AS rank, m.* from                                   
(                            
  SELECT a.p_id, a.userid                                                   
  FROM (SELECT @rank := 0) r, point_table a 
  ORDER BY a.points DESC                                                     
) m
Run Code Online (Sandbox Code Playgroud)