全体的なランキングが必要な場合は、残念ながらテーブル全体を並べ替える必要があります。簡単に言えば、テーブル内の他のランクを知らなければ、テーブル内の誰かのランクを知ることはできません。
とは言うものの、パフォーマンスが心配な場合は、ここでかなり簡単な解決策があります-ランキングクエリの結果をキャッシュし(おそらく別のMySQLテーブルに!)、すべての読み取りに対してそれをクエリします。誰かが新しいスコアを投稿したら、一時テーブルを再計算します。特定のランクの下にあるすべてのレコードを定期的にフラッシュして(たとえば、100未満のランクの人はスコアテーブルから削除されます)、より高いスコアにノックダウンされた後は誰もランクを上げることがないため、再計算を高速に保つことができます。
# Create your overall leaderboards once
create table leaderboards (rank integer primary key, score_id integer, game varchar(65), user_id integer, index game_user_id_idx (game, user_id))
# To refresh your leaderboard, we'll query the ranks for the game into a temporary table, flush old records from scores, then copy
# the new ranked table into your leaderboards table.
# We'll use MySQL's CREATE TABLE...SELECT syntax to select our resultset into it directly upon creation.
create temporary table tmp_leaderboard (rank integer primary key auto_increment, score_id integer, game varchar(65), user_id integer)
select ID, GameName, UserID, from scores where GameName = '$game' order by score desc;
# Remove old rankings from the overall leaderboards, then copy the results of the temp table into it.
delete from leaderboards where game = '$game';
insert into leaderboards (rank, score_id, game, user_id)
select rank, score_id, game, user_id from tmp_leaderboard;
# And then clean up the lower scores from the Scores table
delete from scores join tmp_leaderboard on scores.id = tmp_leaderboard.score_id, scores.GameName = tmp_leaderboard.game where tmp_leaderboard.rank < 100;
# And we're done with our temp table
drop table tmp_leaderboard;
次に、ゲームのランクを読みたいときはいつでも:
select rank from leaderboards where game = '$game' and user_id = '$user_id';