0

私は PHP のバトル システムを作成しており、ランキングを整理する必要があります。

100 人のプレイヤーがいて、あなたはランク 90 だとします。5 ランク上のプレイヤーに挑戦できます。たとえば、ランク 85 のプレイヤーに挑戦して打ち負かすと、あなたは 85 になり、彼は 86 になります。

ただし、データベースでこれを行う方法がわかりません。並べ方とか、並べ方とか。明らかに、あなたの「ランク」でフィールドを保存することはできません。なぜなら、あなたが勝った場合、データベース内であなたの下にランク付けされているすべてのプレーヤーを編集する必要があるからですよね?

どんなアイデアでも役に立ちます。

4

3 に答える 3

1

実際に、データベースにランク カラムを作成し、次のように更新することもできます。update yourtable set playerRank=playerRank+1 where playerRank>85次に、勝者のプレイヤーを playerRank 85 に更新します。これにより、多くのレコードがヒットする可能性がありますが、データベースに大きな負荷がかかることはありません。

于 2012-07-06T09:46:18.770 に答える
1

ランク フィールドを保持し、クエリのボトルネックを緩和することをお勧めします。

あなたの例では、次のようなものを使用します

UPDATE players 
SET rank=IF(playerid=<id-of-challengin-player>,rank-5,rank+1) 
WHERE rank>=85 AND rank<=90

これでランクが変わる

old   new
85    86
86    87
87    88
88    89
89    90
90    85

これはあなたが望むもののように見えますが、インデックスを利用でき、6 行のみに触れる単一のクエリを使用します。

編集

メンテナンスを容易にするために (穴などがある場合はランク番号を修正する)、次を実行します。

CREATE VIEW players_by_rank AS 
SELECT * FROM players ORDER BY rank 

一度、次に使用

UPDATE (SELECT @newrank:=0) AS init, players_by_rank 
SET score=(@newrank:=@newrank+1)

テーブルの隙間を埋める。これはすべての行に影響することに注意してください。

于 2012-07-06T09:45:13.647 に答える
0

あなたが説明する「ランク」は、ポイントなどの他のルールに基づいていないため、計算できるものであるため、このランクをどこにでも保存する必要があります。

そうです、これは毎回大量のレコードを更新する必要があることを意味します。しかし、あなたはあなたの前に最大5つのポジションしか挑戦できないと述べているので、これはまた、毎回6つのレコードを更新するだけでよいことを意味します.. (大したことではありません)

90 -> 85
89 -> 90
88 -> 89
87 -> 88
86 -> 87
85 -> 86
于 2012-07-06T09:44:19.673 に答える