查询数据库,重新排列,插入新表

时间:2012-09-17 19:36:41

标签: java mysql

我已经拥有一个包含每个用户分数和其他统计数据的数据库。但是得分并没有以任何方式组织,使其可以用来制作排行榜排名。

如果表格如下所示:

+----------+-------+-----+ 
| 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中查询数据库中的得分&用户名然后根据数字排名将值重新排列到新表中,而不是分数。

4 个答案:

答案 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,如果这是你需要的。