我已经拥有一个包含每个用户分数和其他统计数据的数据库。但是得分并没有以任何方式组织,使其可以用来制作排行榜排名。
如果表格如下所示:
+----------+-------+-----+
| Username | Score | ... |
+----------+-------+-----+
| UserA | 900 | ... |
+----------+-------+-----+
| UserB | 200 | ... |
+----------+-------+-----+
| UserC | 850 | ... |
+----------+-------+-----+
| UserD | 450 | ... |
+----------+-------+-----+
与数据库中的位置和分数无关。现在,我想要做的是创建一个数据库查询,收集每个用户的分数,然后按分数重新排列。我认为这将是ORDER BY得分DESC。
在以正确的方式对它们进行排序之后,我想将新值输入到只有用户名和等级的表中,我可以查询游戏名称以告知任何给定玩家的等级。
例如:
+----------+------+
| Username | Rank |
+----------+------+
| UserA | 1 |
+----------+------+
| UserC | 2 |
+----------+------+
| UserD | 3 |
+----------+------+
| UserB | 4 |
+----------+------+
现在,如果我在用户名= UserA,我会得到1
的等级那么我的问题是什么?我如何在java中查询数据库中的得分&用户名然后根据数字排名将值重新排列到新表中,而不是分数。
答案 0 :(得分:0)
this thread进行了类似的讨论。
一般来说,最好只选择按分数排序,然后将查询结果放入数组列表中。第0项将是得分最高的人,第1项具有第二项得分的人等等。
如果您确实需要在结果集中选择排名,请尝试使用链接讨论中的一个示例。
答案 1 :(得分: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;
答案 2 :(得分:0)
创建数据库,嗯,以您想要的格式返回您需要的数据:
set @rank = 0;
select username, @rank := @rank + 1 as rank
from user_scores
order by score desc
不需要Java魔法。
答案 3 :(得分: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的问题就像Alain建议的那样,如果分数重复,如果2个用户得分为100,该怎么办?上面的查询会将它们评为#5,如果这是你需要的。