Java 查询数据库、重新排列、插入新表
我已经有了一个数据库,里面有每个用户的分数和其他统计数据。但这些分数并没有以任何方式组织起来,因此无法用于排行榜排名 如果表格看起来像这样:Java 查询数据库、重新排列、插入新表,java,mysql,Java,Mysql,我已经有了一个数据库,里面有每个用户的分数和其他统计数据。但这些分数并没有以任何方式组织起来,因此无法用于排行榜排名 如果表格看起来像这样: +----------+-------+-----+ | Username | Score | ... | +----------+-------+-----+ | UserA | 900 | ... | +----------+-------+-----+ | UserB | 200 | ... | +----------+----
+----------+-------+-----+
| Username | Score | ... |
+----------+-------+-----+
| UserA | 900 | ... |
+----------+-------+-----+
| UserB | 200 | ... |
+----------+-------+-----+
| UserC | 850 | ... |
+----------+-------+-----+
| UserD | 450 | ... |
+----------+-------+-----+
与数据库中的位置和分数无关。现在,我想做的是创建一个数据库查询,收集每个用户的分数,然后按分数重新排列。我想这就像是按分数顺序描述
在以正确的方式对它们进行排序之后,我想将新值输入到一个只包含用户名和排名的表中,我可以查询ingame来告诉所请求的任何给定玩家的排名
例:
现在如果我查询rank,其中username=UserA,我会得到1
那么我的问题是什么?在java中,我如何在数据库中查询score和username,然后根据数字排名而不是分数将值重新排列到新表中。中也有类似的讨论 通常,最好只选择按分数排序,然后将查询结果放入数组列表中。第0项是得分最高的人,第1项是得分第二的人,等等
如果您真的需要在结果集中选择排名,请尝试使用链接讨论中的一个示例。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;
使数据库以所需格式返回所需数据:
set @rank = 0;
select username, @rank := @rank + 1 as rank
from user_scores
order by score desc
不需要Java magic。对于特定用户,这可能会起作用:
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的问题是,如果出现重复的分数,那么如果两个用户的分数为100呢?如果您需要的话,上面的查询会将它们评为5。使用Java操作数据库有很多不同的方法。如果您带着特定的问题回来,您可以使用谷歌搜索JavaMySQL查询找到InFinity教程,那么这是获得帮助的正确地方。您的逻辑是合理的,但代码不会为您编写。另一方面,您知道严格使用SQL语句可以做到这一点,对吗?但如果我想查询特定用户,我是否设置@rank=0;选择username,@rank:=@rank+1作为用户分数中的排名,其中username=userA按分数排序描述测试时发生了什么?没用,对吧?因为WHERE子句从排名中删除了所有其他用户!。尝试改为使用username=userA。
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';