Troche pozmienialem przez co skrocilem dzialanie funkcji do ok 20 sek (300 userow - 300 petli dczytujacych pierwsze zapytanie do bazy)
Zlozylem dwa zapytania z poprzedniego kodu w jedno, dzieki czemu nie wystepuje juz zapytanie w petli ktora jest w jeszcze jednej petli. Zmienilem tez dwa zapytania delete, insert na jedno update.
Funkcja przedstawiona na koncu - updateUsersAvgScore - dodaje uzytkownikom, ktorzy nie brali udzialu w zabawie, usredniony wynik wszystkich userow, ktorzy grali. Dlatego musi ona wystapic na koncu i przefiltrowac ponownie userow (strzelam, ze okolo 10-20% tych 300 userow).
Nie wiem jeszcze co mozna uproscic. 20 sek. przy 300 uzytkownikach (plus ta druga petla z okolo 30-40-oma) to wciaz troche dlugo...
Da sie cos jeszcze z tym zrobic?
<?php
list($comp_margin_scores, $comp_margin_accuracies) = getMarginScore($comp_id); // 1 - getMarginScore wykonuje "SELECT score, margin_accuracy FROM competition_margin WHERE competition_id = $comp_id ";
$qry = "SELECT sysuser.id as id FROM sysuser, sysuser_competition WHERE sysuser_competition.competition_id = $comp_id AND sysuser_competition.sysuser_id = sysuser.id ORDER BY id ASC";
$sth = $dbh->prepare($qry);
$sth->execute();
while ($row = $sth->fetch()) {
$users[] = $row;
}
$no_prediction_users = "";
foreach ($users as $user){
$total_score = 0;
$no_of_predictions = 0;
$qry = "SELECT fixture.id as fix_id, predictions.prediction as prediction, predictions.id as pred_id, predictions.margin as pred_margin, fixture.result as result, fixture.margin as fix_margin
FROM fixture, predictions
WHERE fixture.competition_id = $comp_id
AND fixture.week_id = $week_id
AND fixture.id = predictions.fixture_id
AND predictions.user_id = ".$user["id"]."
ORDER BY fixture.id ASC";
while ($row = $sth->fetch()) {
$no_of_predictions++;
$prediction = $row["prediction"];
$prediction_id = $row["pred_id"];
$pred_margin = $row["pred_margin"];
$result = $row["result"];
$fix_margin = $row["fix_margin"];
$fix_id = $row["fix_id"];
$margin_score = 0;
$score = 0;
$margin_accuracy = 0;
if($result == $prediction){
if($result == "X"){
$score = $competition_type->draw_score;
}elseif($result != ""){
$score = $competition_type->winner_score;
$margin_accuracy = Abs($fix_margin - $pred_margin);
$i=0;
foreach($comp_margin_accuracies as $comp_margin_accuracy){
if($comp_margin_accuracy == $margin_accuracy){
$margin_score = $comp_margin_scores[$i];
}
$i++;
}
if(!$margin_score){
$margin_score = 0;
}
if(!$score){
$score = 0;
}
}
$overal_score = $score + $margin_score;
$total_score = $total_score + $overal_score;
}else{
$overal_score = 0;
}
} //koniec while (odczyty z bazy)
$qry = "UPDATE predictions SET score = $overal_score WHERE id = $prediction_id";
$sth = $dbh->prepare($qry);
$sth->execute();
$margin_score = 0;
$score = 0;
$margin_accuracy = 0;
$user_id = $user["id"];
if($no_of_predictions == 0){
$no_prediction_users .= "$user_id,";
}else{
if(!isCompleted($week_id)){
$qry = "INSERT INTO sysuser_week_score (sysuser_id, week_id, competition_id, score) VALUES ('$user_id', '$week_id', '$comp_id', '$total_score')";
$sth = $dbh->prepare($qry);
$sth->execute();
}else{
$qry = "UPDATE sysuser_week_score SET score = '$total_score' WHERE sysuser_id = $user_id AND competition_id = $comp_id AND week_id = $week_id";
$sth = $dbh->prepare($qry);
$sth->execute();
}
$qry = "UPDATE sysuser_score SET score = (SELECT sum(score) FROM sysuser_week_score WHERE sysuser_id = $user_id AND competition_id = $comp_id), last_week_score = $total_score WHERE sysuser_id = $user_id AND competition_id = $comp_id";
$sth = $dbh->prepare($qry);
$sth->execute();
}
} // koniec petli foreach users
$avg_score = getAvgWeekScore($comp_id, $week_id); // wykonuje SELECT score FROM sysuser_week_score WHERE week_id = $week_id AND competition_id = $comp_id AND avg = 0
updateUsersAvgScore($no_prediction_users, $avg_score, $comp_id, $week_id); //kod ponizej
$qry = "UPDATE week SET completed = 1 WHERE id = $week_id;";
$sth = $dbh->prepare($qry);
$sth->execute();
function updateUsersAvgScore($users, $avg_score, $comp_id, $week_id){
foreach($users as $user_id){
if($user_id){
if(!isCompleted($week_id)){
$qry = "INSERT INTO sysuser_week_score (sysuser_id, week_id, competition_id, score, avg) VALUES ('$user_id', '$week_id', '$comp_id', '$avg_score', 1)";
$sth = $dbh->prepare($qry);
$sth->execute();
}else{
$qry = "UPDATE sysuser_week_score SET score = '$avg_score', avg = 1 WHERE sysuser_id = $user_id AND competition_id = $comp_id AND week_id = $week_id";
$sth = $dbh->prepare($qry);
$sth->execute();
}
$qry = "UPDATE sysuser_score SET score = (SELECT sum(score) FROM sysuser_week_score WHERE sysuser_id = $user_id AND competition_id = $comp_id), last_week_score = $avg_score WHERE sysuser_id = $user_id AND competition_id = $comp_id";
$sth = $dbh->prepare($qry);
$sth->execute();
}
}
}
?>