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

时间:2012-09-09 17:51:49

标签: php mysql

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


P_ID

用户ID


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

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

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

SELECT `p_id` FROM `point_table` ORDER BY `points` DESC

此查询将按点降序给出所有记录。

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

我想运行一个查询, 按点顺序排列表 它应该“搜索”或计算行号,其中的记录是,而不是返回对我有价值。

有人可以帮我解决这个问题吗?这将是一个非常大的帮助。谢谢。

4 个答案:

答案 0 :(得分:13)

This answer应该适合你:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, p_id FROM point_table ORDER BY points DESC;

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

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

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); 

答案 1 :(得分:0)

订购后的行数

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

答案 2 :(得分:0)

由于某种原因,接受的答案对我不起作用 - 它完全忽略了“ORDER BY”语句,按 id(主键)排序

我所做的是:

onBackpressed

答案 3 :(得分:-1)

为表添加新的位置列。定期运行一个cron作业,获取按点排序的所有表行,然后用while循环中的位置更新表。