0

アイデアは、次のような一種のランキング MySQL コマンドを実行することです。

$sql = mysql_query("SELECT f_score FROM ".TBL_FACTIONS." ASC");

編集: ここにも WHERE f_id = $id を追加する必要があります。

f_score列の MySQL データベース テーブルの数値によってランクが決定されます。f_score には 0 から任意の数値のみが含まれ、ユーザー アクションはスコアに加算および減算します。

次に、$sql を使用して配列をループし、各配列要素を「ランク付け」します。特定の変数に番号を割り当てる必要があると思いますので、Webページで番号をエコーできます。

例:あなたのランク: 01

私は軽量のものを探していますが、これを実行してサーバーの使用率を最小限に抑えることができない場合は、それをcronジョブまたは実際には理想的ではないものに押し込む必要があります. 私は配列とループの線に沿って考えていましたか、それとも似たようなものでしたか?

どんな助けでも大歓迎です!

-カルム

4

1 に答える 1

1

このコード:

$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++;
}
于 2010-09-04T13:57:53.380 に答える