如何获得排位?

时间:2012-10-30 17:54:15

标签: php mysql sql

  

可能重复:
  MySQL get row position in ORDER BY
  Calculating rank in PHP/MySQL

我有一个用PHP编写的游戏系统,每个用户都有X金额。 我有一个页面显示网站中最富有的用户。

$ranking = mysql_query("
    SELECT * 
    FROM users 
    ORDER BY money DESC 
    LIMIT 10
");

现在我想让每个用户在列表中的位置。 我无法选择所有信息并开始排序只是为了得到一个值,这是浪费资源。 如何选择行的位置(userid = X)?

(MYSQL)

3 个答案:

答案 0 :(得分:1)

以下是使用相关子查询执行此操作的简单而标准的方法:

SELECT *, (SELECT count(*) + 1 FROM users WHERE money > u.money) as MoneyRank
FROM users AS u
WHERE username = 'X'

这是SqlFiddle demo

但是,这确实会遇到性能问题,因为任何"triangular join"(SQL Server文章,但仍然适用)都会。我仍然会以这种方式自己实现它(很简单),然后索引是否存在性能问题,然后转到其他预先计算/缓存的选项,如果这还不够好的话。评论还提到了其他可行的解决方案。

答案 1 :(得分:0)

Rank列将是列表中的位置:

SELECT t.*, 
   @rownum := @rownum + 1 AS rank
FROM users, (SELECT @rownum := 0) r
ORDER BY money DESC 
LIMIT 10

答案 2 :(得分:0)

如果不进行全表排序,则无法轻松/快速地执行此操作。我建议你只定期给每个人一个新的等级,也许每小时一次,并以这种方式更新他们的位置。

对于“排行榜”,您不会遇到此问题,因为您将始终拥有偏移和限制限制。因此,当您显示前10名(有限)时,您知道他们的排名为1 - 10.

但是,如果没有选择单个用户,如果没有高度 inneficient表排序,则无法执行此操作。

另外,请看另一个问题,(我认为这几乎完全相同?)

Calculating rank in PHP/MySQL