Erkennen Sie zukünftige doppelte Werte, während Sie MySQL durchlaufen, was zu PHP führt

Ich versuche, ein Ranking eines Teams in einer geordneten MySQL-Ergebnismenge zu berechnen, und das Problem, das ich habe, besteht darin, Unentschieden für die zu erkennenzuerst Team mit dem gebundenen Wert zu zeigen.

Angenommen, die Ergebnismenge lautet wie folgt:

team_id    pts
---------------
1          89
2          87
3          76
4          76
5          52

Ich berechne das Ranking des Teams mit folgendem PHP:

$i = 0;
while($row = mysql_fetch_assoc($r)) { //iterate thru ordered (desc) SQL results
    ++$i;
    ($row['pts'] == $prev_val)
        ? $rnk = 'T-' . $rnk    //same as previous score, indicate tie
        : $rnk = $i;            //not same as previous score
    $rnk = str_replace('T-T-','T-',$rnk); //eliminate duplicative tie indicator
    if ($row['team_id'] == $team_id) { //current team in resultset matches team in question, set team's rank
        $arr_ranks['tp']['cat'] = 'Total Points';
        $arr_ranks['tp']['actual'] = number_format($row['pts'],1);
        $arr_ranks['tp']['league_rank'] = $rnk;
        $arr_ranks['tp']['div_rank'] = $div_rnk;
    }
    else if ($i == 1) { //current team is category leader (rank=1) and is not team in question, set current team as leader
        $arr_ranks['tp']['leader'] = "<a href='index.php?view=franchise&team_id=" . $row['team_id'] . "'>" . get_team_name($row['team_id']) . '</a> (' . number_format($row['pts'],1) . ')';
    }
    $prev_val = $row['pts']; //set current score as previous score for next iteration of loop
}

Die obige "Gleichstand" -Logik erfasst Team # 4 als mit Team # 3 verbunden, abernicht umgekehrt.

Mit anderen Worten, für Team # 3,$rnk = 3, während für Team # 4,$rnk = T-3. (Beidesollte "T-3" sein.)

Die Frage lautet also: Wie kann ich beim Durchlaufen der Ergebnisse nach vorne schauen, um herauszufinden, ob die aktuelle Punktzahl ein Unentschieden / Duplikat von Punktzahlen weiter unten in der Liste ist, sodass ich sie zusammen mit den nachfolgenden Dupes als Unentschieden behandeln kann?

Vielen Dank.

BEARBEITEN: Ich kann Ignacios Code implementieren, wenn ich die Ergebnisse zum ersten Mal in einer Tabelle speichere, z"wins" unten:

select
    s1.team_id,
    t.division_id,
    sum(s1.score>s2.score) tot_wins,
            (   select count(*)
                from wins
                where team_id <> s1.team_id
                and wins > (select wins
                            from wins
                            where team_id = s1.team_id)
            )+1 as rnk
from
    scoreboard s1
    left join teams t
        on s1.team_id = t.team_id
    left join scoreboard s2
        on s1.year=s2.year and s1.week=s2.week and s1.playoffs=s2.playoffs and s1.game_id=s2.game_id and s1.location<>s2.location
group by s1.team_id
order by tot_wins desc;

Daraus ergeben sich folgende Ergebnisse:

team_id    division_id   tot_wins  rnk
--------------------------------------
10         1             44        1
2          1             42        2
3          2             42        2
8          1             39        4
5          2             37        5
. . .

Mir fällt jedoch ein, dass ich es warbereits auf diese Ergebnismenge bekommen, und daslöst mein Problem nicht wirklich.

Um Verwirrung zu vermeiden, habe ich gepostetdas "Follow-up" -Problem separat.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage