Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据结果表中的顺序更新行_Mysql_Sql - Fatal编程技术网

Mysql 根据结果表中的顺序更新行

Mysql 根据结果表中的顺序更新行,mysql,sql,Mysql,Sql,我正在编写一个在线数学测试程序,目前正在编写脚本来计算每个用户的排名。下面的代码可以工作,但每次看到它我都会畏缩 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 a

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

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根据每个用户在第一次查询结果中出现的顺序自动更新他们的排名?有一个相关的问题,但它不使用更新


我使用的是MySQL 5。

多亏了上面的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;

规范化数据库的原则之一是不存储计算值。我建议从user_results表中删除该列,并在需要时查询现有数据。我知道,但在结果发布的当晚,该网站的流量非常大。我们这样做,结果只是查询,但我们的服务器冻结-太多的连接。当结果是静态的时,我们的服务器可以处理负载。但问题是,竞争越来越激烈,而这段代码达到了我们服务器允许的最长5分钟的执行时间(我不能改变这一点)。创建一个带有
自动增量
秩字段的临时表,并
插入mytemp(userid,points…)选择userid,测试中的points。。。order by points desc.
在一个查询中创建所有列组这听起来效果不错-现在就开始编码。。。