1

私は、人々がゲームでハイスコアを保存している Web サイトを持っています。私は、より高い他のハイスコアの数を見つけることによって、プレーヤーのハイスコアにランクを割り当てようとしています。したがって、クエリでハイスコアがより高い 5 人が見つかった場合、そのプレーヤーのハイスコア ランクは 6 になります。

問題は、すべてのユーザーのデータベースに (同じゲームの) 複数のスコアを記録できることです。これが、ゲームでプレイヤーの最高スコアのみを表示したい場合にGROUP BY ユーザーを使用している理由です(そのゲームでのすべてのスコアではありません)。

ここに私が今使っているコードがあります。クエリは常に 2 を返すように見えるため、機能しません (プレイヤーのハイスコアよりも高いスコアが 1 つしかないことを常に返す場合のように)。temp GROUP BY userを削除すると、特定のゲームのすべてのプレーヤーからすべてのスコア (プレーヤーがゲーム内の複数のスコアの場合) をカウントするため、半分正しい値が返されます。

$count3 = mysql_result(mysql_query("SELECT COUNT(*) + 1 as Num FROM (SELECT * FROM ava_highscores WHERE game = $id AND leaderboard = $get_leaderboard[leaderboard_id] AND score > '$highscore2[score]') temp GROUP BY user");
4

1 に答える 1

2

を使用すると、結果セット内のすべての行の単一のカウントではなく、グループごとの行のカウントが返されGROUP BYます。代わりに使用してください。また、実際には内部選択は必要ありません。すべてを単一のクエリとして記述できます。COUNTCOUNT(DISTINCT ...)

SELECT COUNT(DISTINCT `user`) + 1 AS Num
FROM ava_highscores
WHERE game = '3'
AND leaderboard = '5'
AND score > '1000'

ノート

  • score比較が正しく機能するように、列が数値型(varchar型ではない)であることを確認してください。
  • にインデックスを追加する(game, leaderboard, score)と、クエリがより効率的になります。インデックス内の列の順序も重要です。
于 2011-10-22T08:20:27.967 に答える