2

可能重复:
MySQL 在 ORDER BY 中获取行位置,
在 PHP/MySQL 中计算排名

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

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

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

(MYSQL)

4

3 回答 3

1

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

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

这是一个SqlFiddle 演示

但是,这确实会遇到任何“三角连接”(SQL Server 文章,但仍然适用)的性能问题。我最初仍然会以这种方式自己实现它(这很简单),然后在存在性能问题时进行索引,如果这还不够好,则继续使用其他预先计算/缓存的选项。评论还提到了其他可行的解决方案。

于 2012-10-30T20:46:30.723 回答
0

如果不进行全表排序,您将无法轻松/快速地做到这一点。我建议你只定期给每个人一个新的排名,也许每小时一次,并以这种方式更新他们的位置。

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

然而,仅仅选择一个单独的用户,如果没有一个非常无效的表排序,你就无法做到这一点。

另外,请参阅this other question,哪个(我认为几乎完全重复?)

在 PHP/MySQL 中计算排名

于 2012-10-30T18:02:35.643 回答
0

Rank列将是列表中的位置:

SELECT t.*, 
   @rownum := @rownum + 1 AS rank
FROM users, (SELECT @rownum := 0) r
ORDER BY money DESC 
LIMIT 10
于 2012-10-30T17:58:02.253 回答