0

ハイスコ​​アのゲームのプレーヤーのリストがあります。私の名前が「じんぼ」の場合のスコアを取得し、ランキングの順位と、ランキングで自分の隣にいる人を 2 ランク上げて 2 ランク下げてもらいたいです。

CREATE TABLE `players` (
  `id` bigint(100) NOT NULL AUTO_INCREMENT,
  `playername` varchar(15) NOT NULL,
  `email` varchar(300) NOT NULL,
  `highscore` bigint(100) NOT NULL,
  PRIMARY KEY (`id`)
 ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ;
4

1 に答える 1

1

これを実現する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;

追加するidplayername、同じのプレーヤーの一貫した順序を確保したい場合があります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つのクエリに減らすことができます(パフォーマンスとリアルタイムの間の妥協点だと思います-ネス)。次に使用するクエリは、上記のクエリから簡単に導き出すことができますが、前述の一時テーブルの制限に制限されないという違いがあります。

于 2012-05-09T09:48:24.860 に答える