【问题标题】:query to fetch records and their rank in the DB查询以获取记录及其在数据库中的排名
【发布时间】:2011-08-05 19:48:41
【问题描述】:

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

1 个玩家名字 4500

2 其他玩家 4100

3 另一个人 3900 ...

134 当前玩家 140

我试过用工会查询,但没有得到当前玩家排名。 有什么想法吗?

数据库是 MYSQL。

10 倍,周末愉快 :)

编辑

这是我尝试过的:

(select substr(first_name,1,10) as first_name, 结果 FROM top_scores ts WHERE result_date >= NOW() - 间隔 1 天 限制 10) 联盟 (select substr(first_name,1,10) as first_name, 结果 FROM top_scores ts 其中 first_name='XXX' 和 result=3030);

【问题讨论】:

  • 当您不知道表格是什么样子时,很难回答这样的问题。您可以将您尝试的两个表发布到UNION吗?
  • 是否有充分的理由在其中只包含“一个查询”?
  • 我添加了额外的信息

标签: mysql sql


【解决方案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';

【讨论】:

  • 但是如果当前玩家等级是150呢?我想得到top X结果和当前玩家结果。
【解决方案2】:

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

你的表结构是:

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

它会做你想做的事

【讨论】:

  • 这将获得前 10 名记录,我还需要获得当前玩家排名。
  • 您希望您的结果集列出排名前 x 的玩家,然后列出所选玩家的信息?
  • 问题是我没有排名列,这是我必须根据结果计算出来的。
【解决方案3】:

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

playername 
score
calculated_rank

您的查询应该类似于:

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

【讨论】:

    【解决方案4】:

    我假设您在此表上有 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 > t1.id”),以防止具有相同结果的多个人具有相同的位置。

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

    【讨论】:

    • 我收到以下错误:#1248 - 每个派生表都必须有自己的别名
    • 我已经解决了这个问题。 “t”是必要的:)
    猜你喜欢
    • 2012-03-08
    • 2017-02-28
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多