0

私はすでに、すべてのユーザーのスコアとその他の統計を含むデータベースを持っています。しかし、スコアは、リーダーボードのランク付けに使用できるような方法で編成されていません.

テーブルが次のようになっている場合:

+----------+-------+-----+ 
| Username | Score | ... |
+----------+-------+-----+
|   UserA  | 900   | ... |
+----------+-------+-----+
|   UserB  | 200   | ... |
+----------+-------+-----+
|   UserC  | 850   | ... |
+----------+-------+-----+
|   UserD  | 450   | ... |
+----------+-------+-----+

データベース内の位置とスコアには関係ありません。ここで、私がやりたいことは、各ユーザーのスコアを収集するデータベースのクエリを作成し、スコアごとに並べ替えることです。これは ORDER BY score DESC のようなものになると思います。

それらを正しい方法で並べ替えた後、ユーザー名とランクのみを含むテーブルに新しい値を入力したいと考えています。これをゲーム内で照会して、要求された特定のプレイヤーのランクを知ることができます。

元:

+----------+------+ 
| Username | Rank |
+----------+------+
|   UserA  | 1    |
+----------+------+
|   UserC  | 2    |
+----------+------+
|   UserD  | 3    |
+----------+------+
|   UserB  | 4    |
+----------+------+

ここで、username=UserA のランクを照会すると、1 が返されます

それで、私の質問は何ですか?Javaで、データベースにスコアとユーザー名を照会し、スコアではなく数値ランクに基づいて値を新しいテーブルに再配置するにはどうすればよいですか。

4

4 に答える 4

0

データベースが必要なデータを必要な形式で返すようにします。

set @rank = 0;
select username, @rank := @rank + 1 as rank
from user_scores
order by score desc

Java マジックは必要ありません。

于 2012-09-17T19:44:46.667 に答える
0

「Javaで」は、質問の唯一の紛らわしい部分です。次のようなものが必要です。

CREATE TABLE leaderboard (username varchar(50), score int unsigned, rank int unsigned)

INSERT INTO leaderboard (username, score, rank) SELECT username, score, @rank:=@rank+1 FROM scores_table, (SELECT @rank:=0) as run_once order by rank desc;

テストされていませんが、それがコンセプトです。リーダーボードを再計算するときは、次のようにします。

DELETE * from leaderboard;

INSERT INTO leaderboard (username, score, rank) SELECT username, score, @rank:=@rank+1 FROM scores_table, (SELECT @rank:=0) as run_once order by score desc;
于 2012-09-17T19:43:48.880 に答える
0

このスレッドでも同様の議論がありました。

一般に、スコアによる順序付けを選択してから、クエリ結果を配列リストに入れる方が適切です。0 番目のアイテムは最高のスコアを持つ人、1 番目のアイテムは 2 番目のスコアを持つ人などになります。

結果セットでランキングを使用して選択する必要がある場合は、リンクされたディスカッションの例の 1 つを使用してみてください。

于 2012-09-17T19:40:53.820 に答える
0

特定のユーザーの場合、これはうまくいくかもしれません:

select username, score, (select count(h.username)+1 from users u, (select username, score from users) h where u.username = 'UserG' and (h.score > u.score)) as 'rating' from users where username = 'UserG';

アランが提案したように変数 @rank を設定する際の問題は、スコアが重複している場合です。2 人のユーザーのスコアが 100 の場合はどうなりますか? 上記のクエリは、必要に応じて両方を #5 と評価します。

于 2012-09-17T20:29:32.997 に答える