可能重复:
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)
答案 0 :(得分:1)
以下是使用相关子查询执行此操作的简单而标准的方法:
SELECT *, (SELECT count(*) + 1 FROM users WHERE money > u.money) as MoneyRank
FROM users AS u
WHERE username = 'X'
但是,这确实会遇到性能问题,因为任何"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表排序,则无法执行此操作。
另外,请看另一个问题,(我认为这几乎完全相同?)