このコード:
$result = mysql_query("SELECT f_name FROM ".TBL_FACTIONS." ORDER BY f_score DESC");
$i = 1;
while($row = mysql_fetch_assoc($result))
{
echo "{$row['f_name']} & Rank: {$i}<br>";
$i++;
}
出力します:
Bla bla & Rank: 1
Foo bar & Rank: 2
Etc.
特定のレコードのランクの SQL は少し複雑です。次のことを試すことができます。
// E.g. rank for f_id = 123
$id = 123;
$sql = "
SELECT `a`.`rank` + `b`.`rank` AS `rank`
FROM (SELECT COUNT(*)+1 AS `rank`
FROM ".TBL_FACTIONS."
WHERE `f_score` > (SELECT `f_score`
FROM ".TBL_FACTIONS."
WHERE `f_id` = {$id})) AS `a`
STRAIGHT_JOIN (SELECT COUNT(*) AS `rank`
FROM ".TBL_FACTIONS."
WHERE `f_score` = (SELECT `f_score`
FROM ".TBL_FACTIONS."
WHERE `f_id` = {$id}) AND `f_id` < {$id}) AS `b`
";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
echo "{$id} is ranked {$row[0]}";
ここでクエリを見つけましたが、それは理にかなっていますが、取得した結果が期待どおりかどうかを徹底的にテストしてください。
または、レコードセットが大きすぎない場合は、結果をループして、探している ID に到達したらループから抜け出すことができます。
$id = 123;
$result = mysql_query("SELECT f_id FROM ".TBL_FACTIONS." ORDER BY f_score DESC");
$i = 1;
while($row = mysql_fetch_assoc($result))
{
if($row['f_id'] == $id)
{
echo "{$row['f_id']} is ranked {$i}<br>";
break;
}
$i++;
}