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 は使用しません。

MySQL5を使用しています。

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 に答える