我正在编写一个在线数学测试程序,目前正在编写脚本来计算每个用户获得的排名。以下代码有效,但每次看到它都会感到畏缩。
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可以根据它们在第一个查询的结果中出现的顺序自动更新每个用户的排名?有一个相关问题here,但它不使用UPDATE。
我正在使用MySQL 5.
答案 0 :(得分: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;