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

Я делаю мобильное приложение для фэнтези-спорта, оно содержит спички, и в пределах одного матча может быть любое количество соревнований. В качестве примера мы рассмотрим 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();
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]