Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查询数据库、重新排列、插入新表_Java_Mysql - Fatal编程技术网

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