これは私が以前に尋ねた質問のフォローアップです。
ランク(同点のロジックを含む)をうまく計算できます。問題は、重複ランクの最初のインスタンスに遭遇したときに、将来の重複を検出することです。
結果セットを取得するためのSQLクエリは次のとおりです。
SELECT
s1.team_id,
sum(s1.score>s2.score) wins
FROM scoreboard s1
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 wins DESC;
これは、PHPでループするサンプルSQL結果セットです。
team_id wins
--------------
10 52
2 48
5 46
11 46
3 42
9 39
...
これがディスプレイ用の私のPHPコードで、すべてのタイランクに「T-」を追加する必要があります。
$i = 0;
while($row = mysql_fetch_assoc($r)) { //iterate thru ordered (desc) SQL results
++$i;
($row['wins'] == $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 Wins';
$arr_ranks['tp']['actual'] = number_format($row['wins'],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['wins']) . ')';
}
$prev_val = $row['wins']; //set current score as previous score for next iteration of loop
}
上記の「タイ」ロジックは、チーム#4をチーム#3とタイしたものとしてキャプチャしますが、その逆はありません。
つまり、チーム#3の場合$rnk = 3
は、、チーム#4の場合は$rnk = T-3
。(どちらも「T-3」である必要があります。)
したがって、問題は次のようになります。結果を繰り返し処理しながら、現在のスコアがリストのさらに下のスコアの同点/重複であるかどうかを確認するために「先読み」して、後続の重複と一緒に同点として扱うことができるようにするにはどうすればよいですか。
@Airzookaは私に潜在的な解決策を与えてくれましたが、それを行うためのより効率的な方法があるかどうか知りたいです(おそらくSQLレベルでも)。
ありがとう。