0

=これを行う最善の方法は何ですか? ハイスコ​​アリストのスコア順に 100 レコードをプルバックしています。また、ユーザーのランクとポイントを次の位置に引き戻す必要があります。

私は現在そのようにやっていますが、それが最善の方法かどうかはわかりません

mysql_query("SELECT * FROM highScores ORDER BY score DESC");

これらの結果をループして、上位のスコアを表示しています。次に、ユーザーのランクと次のポイントを取得するために、次のことを行っています

$rank = mysql_num_rows(mysql_query("SELECT id, score FROM highScores WHERE score>='$userScore'"));

これでランクを取得し、ユーザーの次の位置を求めて別のクエリを実行し、そのスコアを取得します

$next_rank_score = mysql_fetch_assoc(mysql_query("SELECT score FROM highScores ORDER BY score DESC LIMIT " . ($rank-2) . ",1"));

これを行うにはもっと良い方法が必要ですが、思いつきません。

4

1 に答える 1

0

実行していることが機能する場合は、必ずしも変更する必要はありません。アイデアを得ることができて良かったです。質問してよかったです。

これは、データベースで 1 つのヒットのみを必要とするアプローチです。また、返されるレコードの数を制限すると、特に上位 10 を選択するためのスコアが多数ある場合は、速度が向上します。

    <?php

$query = 'SELECT * FROM highScores ORDER BY score DESC limit 0, 101';
$highScores = mysql_query($query);
$ranks = array();
$scores = array();
$score_to_nexts = array();
$i=1;
while ($highScore = mysql_fetch_array($highScores) and $i<102):
    $ranks[$i] = $i;
    $scores[$i] = $highScore['score'];
    if ($i !== 1):
        $score_to_nexts[$i-1] = strval($scores[$i-1] - $scores[$i])
    endif;
    $i++;
endwhile;

$i=1;
while ($i<11):
    $rank   = $ranks[$i];
    $scores = $scores[$i];
    $score_to_next = $score_to_nexts[$i];
    $i++;
endwhile;
?>

php は目もくらむほどの速さで配列をリッピングするので、これは間違いなく実行可能な速さに近いでしょう。サイクルを圧縮するためのいくつかのロジックがあるかもしれませんが、配列は 11 個のメンバーしか処理する必要がないため、これで実行します。

あなたが持っているルーチンの問題は、スコアが DB 読み取り間で変化する可能性があるため、数値が正しく加算されないことです。1 回の DB 読み取りからスコアを実行することで、すべてが同期されます。

DB 読み取りの時間に関しては、以前は余分な DB 読み取りを実行することは大したことではありませんでしたが、現在ではそれほど重要ではありません。Web サーバーは DB の一部をメモリにロードし、DB の読み取りを PHP のみのメモリ内操作と同じくらい高速にします。例外は、大量のデータを実行しているか、大量のトラフィックを取得しており、リソースを節約する必要がある場合です。

于 2013-09-19T03:03:48.090 に答える