MySQL基于其他值更新列

时间:2013-12-07 11:35:13

标签: php mysqli

我正在构建一个简单的游戏系统,我想知道如何在不计算每次查询结果的情况下获得用户排名(也许我应该运行一个cron作业?)。 这是我目前的points表格结构:

+--username--+--rank--+--total_points--+
|######################################|
|    Mark    |   0    |      700       |
|------------+--------+----------------|
|    Luke    |   0    |      400       |
+------------+--------+----------------+

如何根据rank更新total_points列? 有一个更好的方法吗?谢谢你的时间

2 个答案:

答案 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值的用户