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    |
+----------+------+

现在,如果我查询用户名 = UserA 的排名,我会得到 1

那么我的问题是什么?我如何在 java 中查询数据库的分数和用户名,然后根据数字排名而不是分数将值重新排列到一个新表中。

4

4 回答 4

0

这个线程中有类似的讨论。

一般来说,最好只选择按分数排序,然后将查询结果放入数组列表中。第 0 项是得分最高的人,第 1 项是得分第二的人,依此类推。

如果您确实需要在结果集中选择排名,请尝试使用链接讨论中的示例之一。

于 2012-09-17T19:40:53.820 回答
0

“In 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

制作数据库,嗯,以你想要的格式返回你需要的数据:

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

对于特定用户,这可能有效:

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';

像 Alain 建议的那样设置变量 @rank 的问题是在重复分数的情况下,如果 2 个用户的分数为 100 怎么办?如果您需要的话,上面的查询会将它们都评为#5。

于 2012-09-17T20:29:32.997 回答