我正在构建一个简单的游戏系统,我想知道如何在不计算每次查询结果的情况下获得用户排名(也许我应该运行一个cron作业?)。
这是我目前的points
表格结构:
+--username--+--rank--+--total_points--+
|######################################|
| Mark | 0 | 700 |
|------------+--------+----------------|
| Luke | 0 | 400 |
+------------+--------+----------------+
如何根据rank
更新total_points
列?
有一个更好的方法吗?谢谢你的时间
答案 0 :(得分:1)
您只需要一个查询:
UPDATE
users,
(SELECT
@row:=@row+1 rownum,
username
FROM users,
(SELECT @row := 0) r
ORDER BY total_points DESC) as rank_ord
SET users.rank = rank_ord.row
WHERE users.username = rank.username;
如果您的表包含索引列(用户名除外),则更改条件
WHERE users.username = rank.username
到
WHERE users.id = rank.id
让它更快。
答案 1 :(得分:0)
假设排名取决于total_points
,您只需要按total_points DESC
对查询结果进行排序,行号就是您排名的位置。无需计算任何东西。当然,你可能有两个用户具有相同的total_points
,所以如果你想拥有相同的等级,这将无效,但你可以做同样的方法(伪代码)非常简单:
$rows = query with order total_points DESC
$rank = 0;
$last_total_points = -1;
foreach( $rows as $row ) {
if( $row['total_points'] != $last_total_points ) {
$rank++;
$last_total_points = $row['total_points'];
}
update that row with $rank;
}
因此,最后,您将获得所有排名相同且排名相同的total_points值的用户