查询以获取数据库中的记录及其排名

时间:2011-08-05 19:48:42

标签: mysql sql

我有一个包含用户名和结果的表。 当用户将其结果插入数据库时​​,我想执行将返回的查询 前X个结果(在数据库中的排名),也将得到该用户结果 和他在DB中的排名。 结果应该是这样的:

1名队员4500

2 otherplayer 4100

另外一个人3900 ...

134当前玩家140

我已尝试使用union进行查询,但后来我没有获得当前的玩家等级。 任何人的想法?

数据库是MYSQL。

10x很多并且周末很愉快:)

修改

这就是我的尝试:

(选择substr(first_name,1,10)作为first_name,结果         来自top_scores ts         WHERE result_date> = NOW() - INTERVAL 1天         限制10)         联盟 (选择substr(first_name,1,10)作为first_name,result         来自top_scores ts         其中first_name ='XXX',结果= 3030);

4 个答案:

答案 0 :(得分:1)

根据我在这里阅读的内容:

您的表结构是:

+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(50) | YES  |     | NULL    |       |
| result | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

表格数据如下:

+---------+--------+
| name    | result |
+---------+--------+
| Player1 |   4500 |
| Player2 |   4100 |
| Player3 |   3900 |
| Player4 |   3800 |
| Player5 |   3700 |
| Player6 |   3600 |
| Player7 |   3500 |
| Player8 |   3400 |
+---------+--------+

您希望结果集如下所示:

+------+---------+--------+
| rank | name    | result |
+------+---------+--------+
|    1 | Player1 |   4500 |
|    2 | Player2 |   4100 |
|    3 | Player3 |   3900 |
|    4 | Player4 |   3800 |
|    5 | Player5 |   3700 |
|    6 | Player6 |   3600 |
|    7 | Player7 |   3500 |
|    8 | Player8 |   3400 |
+------+---------+--------+

SQL:

 set @rank = 0;
 select 
top_scores.* 
 from 
 (select ranks.* from (select @rank:=@rank+1 AS rank, name, result from ranks) ranks) top_scores
where 
top_scores.rank <= 5
or (top_scores.result = 3400 and name ='Player8');

这将做你想做的事

答案 1 :(得分:1)

SET X = 0;

SELECT @X:=@X+1 AS rank, username, result
FROM myTable
ORDER BY result DESC
LIMIT 10;

重新评论:

这个怎么样:

SET X = 0;

SELECT ranked.* 
FROM (
    SELECT @X:=@X+1 AS rank, username, result
    FROM myTable
    ORDER BY result DESC
) AS ranked
WHERE ranked.rank <= 10 OR username = 'current';

答案 2 :(得分:0)

假设您的表格包含以下列:

playername 
score
calculated_rank

您的查询应该类似于:

select calculated_rank,playername, score 
from tablename 
order by calculated_rank limit 5

答案 3 :(得分:0)

我假设你在这张桌子上有PRIMARY KEY。如果你不这样做,只需创建一个。我的表格结构(因为你没有自己提供)是这样的:

id          INTEGER
result      INTEGER
first_name  VARCHAR

SQL查询应该是这样的:

SELECT @i := @i+1 AS position, first_name, result FROM top_scores, (SELECT @i := 0) t ORDER BY result DESC LIMIT 10 UNION
SELECT (SELECT COUNT(id) FROM top_scores t2 WHERE t2.result > t1.result AND t2.id > t1.id) AS position, first_name, result FROM top_scores t1 WHERE id = LAST_INSERT_ID();

我在子查询中添加了附加条件(“AND t2.id&gt; t1.id”),以防止具有相同结果的多个人具有相同的位置。

编辑:如果您有一些登录系统,最好使用结果保存userid并使用它获取当前用户结果。