【问题标题】:Mysql - How to get a row number after Order by?Mysql - 如何在Order by后获取行号?
【发布时间】:2012-09-02 17:10:13
【问题描述】:

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


p_id

用户名

积分


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

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

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

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

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

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

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

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

【问题讨论】:

标签: php mysql


【解决方案1】:

This answer 应该适合你:

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

更新:您可能还需要考虑在更新点并将其保存到同一个表中的附加列时计算排名。这样,您还可以选择单个用户并了解他的排名。这取决于您的用例,哪种更有意义且性能更好。

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

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

【讨论】:

  • 它实际上对我不起作用,因为在我的情况下正确的数字应该是 2 时,它总是给我“1”。您还忘记了仅为特定用户选择行。
  • 您能向我们展示您更新的代码,甚至可以展示一些示例条目吗?
  • mysql_query("SET @rank=0;"); return mysql_query("SELECT @rank:=@rank+1 AS rank, p_id FROM point_table WHERE userid = $sessionuserid ORDER BY points DESC");
  • 所以没有像 I ORDER 表中的数据这样的查询,而不是给他们一个行号,然后选择那个特定的行号,其中 userid = userid???没有这样的事吗? :OO 那会很有趣。
  • 谢谢,但它实际上不起作用:/ 顺便问一下,那里的“r”和“t”是什么?
【解决方案2】:

排序后的行号

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

【讨论】:

    【解决方案3】:

    由于某种原因,接受的答案对我不起作用 - 它完全忽略“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;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我实际上并不想向表发送更新。那是因为如果我有 100,000 个成员,其中 20,000 个成员每 1 秒更新一次数据库,那将是一场灾难。这就是为什么我只想使用查询来获得他们的排名。我不会用它做任何其他事情,只需要排名。
      • 我认为这就是 stackoverflow 所做的。他们不是每秒钟都这样做。他们每天做一次。网页游戏排名也是如此。
      • 嗯,你认为它比在 1 中运行 2 个查询更好/更胖吗?
      • 应该是一样的。不同的是。在这里你做一次,你一直在做
      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 2020-09-21
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多