11

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


p_id

用户身份

积分


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

所以我们有一张表,上面有超过 5000 条有积分的人的记录,对吧?现在我想按它们的点(降序)对它们进行排序,因此如果我运行 MySQL 查询,点数最高的用户将位于页面顶部。

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

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

此查询将按点按降序为我提供所有记录。

好的,我的问题来了,现在(订购时)我想向每个用户显示他们实际上在哪个地方。所以我想给每个用户这样的东西:“你是 5374 个用户中的 623 个”。问题是我无法指定“623”号码。

我想运行一个查询,它按点对表进行排序,它应该“搜索”或计算行号,它们的记录在哪里,然后将该值返回给我。

谁能帮助我如何为此建立查询?这将是一个很大的帮助。谢谢你。

4

4 回答 4

16

这个答案应该适合你:

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); 
于 2012-09-09T17:56:27.933 回答
5

排序后的行号

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
于 2019-09-18T17:48:41.440 回答
0

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

我所做的是:

SET @rn=0;
CREATE TEMPORARY TABLE tmp SELECT * FROM point_table ORDER BY points DESC;
SELECT @rn:=@rn+1 AS rank, tmp.* FROM tmp;
于 2021-02-21T07:31:29.110 回答
-1

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

于 2012-09-09T18:02:01.393 回答