2

我正在编写一个在线数学测试程序,目前正在编写脚本来计算每个用户获得的排名。以下代码有效,但每次看到它我都会畏缩。

get_set() 将查询结果放入 $users

function rank_users_in_test($tid){
  $GLOBALS['DB']->get_set($users,"select user,test from user_results where test=$tid order by points desc,time");
  // $users are already in order by rank thanks to ORDER BY
  $rank = 1;
  foreach ($users as $u){
    $GLOBALS['DB']->query("update user_results set world_rank=$rank where user={$u['user']} and test={$u['test']}");
    $rank++;
  }
}

循环中的查询让我有点哭了。我的问题是,有没有一种方法可以让 MySQL 根据用户在第一次查询结果中出现的顺序自动更新每个用户的排名?这里有一个相关的问题,但它不使用 UPDATE。

我正在使用 MySQL 5。

4

1 回答 1

0

感谢上面的 ring0,以下将运行时间从几分钟减少到几秒钟:D

create table temp (
  rank int auto_increment,
  user int,
  test int,
  primary key(rank)
);

insert into temp(user,test) (select user,test from user_results where test=$tid order by points desc,time);

update user_results ur, temp t set ur.world_rank=t.rank where ur.user=t.user and ur.test=t.test;

drop table temp;
于 2013-02-16T17:56:22.030 回答