1

さまざまな世界のすべてのプレイを追跡するゲームのハイスコアデータベースがあります。私がやりたいのは、プレイに関するいくつかの統計を見つけてから、各世界がお互いの世界に従って「ランク付け」されている場所を見つけることです(プレイされた回数でソートされています)。

これまでのところ、すべての統計が正常に機能していますが、各世界のランキングを見つけるのに問題が発生しました。

また、3つの別々のクエリでこれを行うことは、おそらくこれを実行するのに非常に遅い方法であり、おそらく改善される可能性があると確信しています。

タイムスタンプ列(ここでは使用されていません)とDBスキーマでインデックス付けされた「ワールド」列があります。これが私のソースの選択です:

function getStast($worldName) {
  // ## First find the number of wins and some other data:
  $query = "SELECT COUNT(*) AS total, 
            AVG(score) AS avgScore, 
            SUM(score) AS totalScore
            FROM highscores 
            WHERE world = '$worldName'
            AND victory = 1";
  $win = $row['total'];

  // ## Then find the number of losses:
  $query = "SELECT COUNT(*) AS total 
            FROM highscores 
            WHERE world = '$worldName'
            AND victory = 0";
  $loss = $row['total'];

  $total = $win + $loss;

  // ## Then find the rank (this is the broken bit):
  $query="SELECT world, count(*) AS total 
          FROM highscores 
          WHERE total > $total
          GROUP BY world
          ORDER BY total DESC";

  $rank = $row['total']+1;
  // ## ... Then output things.
}

私が失敗している特定のコード行は、RANKクエリにあると思います。

              WHERE total > $total

WHERE句の引数として計算された合計を受け入れることができないため、機能していませんか?

最後に、単一のSQLクエリでこれらすべてを計算するためのより効率的な方法はありますか?

4

1 に答える 1

4

'合計>$total'を使用することをお勧めしますか?

SELECT world, count(*) AS total 
FROM highscores 
GROUP BY world
having total > $total
ORDER BY total DESC
于 2009-04-29T01:17:19.507 に答える