これを実現する1つの方法は、一時テーブルを使用することです。
CREATE TEMPORARY TABLE ranked_players AS
SELECT id, playername, @rownum:=@rownum+1 AS rank
FROM players
JOIN (SELECT @rownum:=0) AS RANK
ORDER BY highscore DESC;
追加するid
かplayername
、同じのプレーヤーの一貫した順序を確保したい場合がありますhighscore
。
次に、プレーヤーのランクを把握する必要があります(MySQLでは同じクエリで一時テーブルを2回使用できないため、次のステートメントのサブクエリに入れることはできません)。
SELECT rank
INTO @myrank
FROM ranked_players
WHERE playername = 'jimbo';
次に、ランクが2位から2位までのプレーヤーの範囲を取得する必要があります。
SELECT players.*
FROM players
JOIN ranked_players USING (id)
WHERE rank BETWEEN (@myrank - 2) AND (@myrank + 2)
ORDER BY highscore DESC;
次に、一時テーブルをクリーンアップします。
DROP TEMPORARY TABLE ranked_players;
最後に、実際のテーブルでユーザーのリストを事前に計算しrank
、アプリケーションにとって意味のあるときに更新する場合は、これを1つのクエリに減らすことができます(パフォーマンスとリアルタイムの間の妥協点だと思います-ネス)。次に使用するクエリは、上記のクエリから簡単に導き出すことができますが、前述の一時テーブルの制限に制限されないという違いがあります。