Обновление рейтинга лидеров для нескольких субконкурсов с использованием php и mysql - PullRequest
0 голосов
/ 21 декабря 2018

Я делаю мобильное приложение для фэнтези-спорта, оно содержит спички, и в пределах одного матча может быть любое количество соревнований.В качестве примера рассмотрим 100 фэнтезийных конкурсов, проходящих в рамках одного матча. Я хочу обновить рейтинги лидеров всех этих конкурсов.Прямо сейчас я делаю это в цикле, используя php.Сначала я получаю все фэнтезийные конкурсы в определенном матче, а затем перебираю все конкурсы и обновляю ранги для каждого из них.Он работает нормально, но проблема в том, что это занимает слишком много времени.На 100 соревнований это занимает от 80 до 100 секунд, что очень много.Я хочу обновить их все в одном запросе MySQL.Справка?

Вот код, который я использую для обновления списков лидеров.Заранее спасибо.

$stmt=$conn->Prepare("SELECT FC.fantasy_contest_id from fantasy_contests as FC 
where FC.cricket_contest_id = ?");
$stmt->bind_param('i', $cc_id);
$stmt->execute();
$stmt->bind_result($fantasy_contest_id);
$i=0;
$response["fantasy_contests"] = array();
    /* fetch values */
    while ($stmt->fetch()) {
        $output[$i]=array(
            'fantasy_contest_id' => $fantasy_contest_id
                        );
        array_push($response["fantasy_contests"], $output[$i]);
        $i++;    
    }

foreach ($response['fantasy_contests'] as $contest) {

$fan_id = $contest['fantasy_contest_id'];

$stmt=$conn->Prepare("SET @pk1 = NULL");
$stmt->execute();
$stmt->close();

$stmt=$conn->Prepare("SET @rn1 = ?");
$stmt->bind_param('i', $myval);
$stmt->execute();
$stmt->close();

$stmt=$conn->Prepare("SET @sal = NULL");
$stmt->execute();
$stmt->close();

$stmt=$conn->Prepare("SET @val = ?");
$stmt->bind_param('i', $myval);
$stmt->execute();
$stmt->close();

$stmt=$conn->Prepare("UPDATE fantasy_contest_teams dest, (SELECT  
fantasy_contest_teams_id, fantasy_contest_id,
total_points, rank FROM ( SELECT  fantasy_contest_teams_id, fantasy_contest_id,
total_points,
@rn1 := if(@pk1=fantasy_contest_id, if(@sal=total_points, @rn1, @rn1+@val),1) 
as rank,
@val := if(@pk1=fantasy_contest_id, if(@sal=total_points, @val+1, 1),1) as 
value,
@pk1 := fantasy_contest_id,
@sal := total_points FROM ( SELECT AA.fantasy_contest_teams_id, 
AA.fantasy_contest_id, BB.total_points
FROM fantasy_contest_teams as AA 
left join fantasy_teams as BB on AA.fantasy_team_id = BB.fantasy_team_id 
where AA.fantasy_contest_id = ?
ORDER BY fantasy_contest_id,total_points DESC) A) B) src 
SET dest.rank = src.rank 
WHERE dest.fantasy_contest_teams_id = src.fantasy_contest_teams_id;");
$stmt->bind_param('i', $fan_id);
$stmt->execute();
$stmt->close();
 }
...