TOP 10使用MySQL的玩家列表,显示玩家的个人位置,即使他不在最佳列表中

时间:2014-02-27 17:23:21

标签: mysql sql

我遇到了这个小问题: 我想用MySQL为我的游戏组织一个top10列表。嗯,实际上它已经可以工作了,但我需要添加一个功能。 说,我得到的表包含一个名为'level'的字段 例如,数据库中有1万名玩家,每个玩家都有自己的等级。因此,要创建前十名列表,我会这样做:

SELECT `values`.`level` FROM `values` ORDER BY `values`.`level` DESC LIMIT 10

它工作正常,给了我10名最高级别的球员。但是,如果玩家自己不在前十名单上怎么办?而且他想知道他还有多少钱可以到达那里。 我们这样代表它: 他看到得分表显示了10名最佳球员,桌子的底部看到了他自己的记录,例如你的位置是4023 当然我可以通过级别降序来检索来自MySQL的所有记录,并使用循环计算用户的位置,但船长明显告诉我这不是最合理的方法: - )

我需要结果看起来像这样(仅限10个用户,而不是5个)

    +-------+------+--------+
    | level | pos  |user    |
    +-------+------+--------+
    | 23    |    1 |Alex    |
    | 19    |    2 |John    |
    | 18    |    3 |James   |
    | 16    |    4 |Ashley  |
    | 15    |    5 |Casey   |
    |       |      |        |
    | 4     |  145 |You     |
    +-------+------+--------+

那么,有一种方法可以在一个查询中完成吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

联盟可以做到这一点,请参阅伪代码以获得想法

(
SELECT `values`.`level` FROM `values` ORDER BY `values`.`level` DESC LIMIT 10
UNION
SELECT `values`.`level` FROM `values` where playerId = loggedPlayerId
) ORDER BY `values`.`level`

答案 1 :(得分:0)

这是你所期待的。

(
SET @rank=0;
SELECT 
`values`.`level`,
@rank:=@rank+1 AS pos, 
`values`.userID
FROM 
`values` 
ORDER BY `values`.`level` DESC 
LIMIT 10;
)
UNION
(
SELECT 
v1.`level`,
COUNT(*) as pos, 
v1.userID
FROM 
`values` AS v1
LEFT JOIN
`values` AS v2
ON( v1.level < v2.level )
WHERE v1.userID = 24342
GROUP BY 1
)

我假设名为values的表中会出现一个名为userID的列。

答案 2 :(得分:0)

考虑以下内容(尽管这在大型数据集上的扩展性很差)...

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT x.*
     , COUNT(*) rank 
  FROM ints x 
  JOIN ints y 
    ON y.i <= x.i 
 GROUP 
    BY x.i 
HAVING rank <=3 
    OR i=7;
+---+------+
| i | rank |
+---+------+
| 0 |    1 |
| 1 |    2 |
| 2 |    3 |
| 7 |    8 |
+---+------+

我怀疑这样的事情会更好地扩展......

SELECT * 
  FROM 
     ( SELECT i.*
            , @i:=@i+1 rank 
         FROM ints i
            , (SELECT @i:=0) n 
        ORDER 
           BY i
     ) x 
 WHERE rank <= 3 
    OR i = 7;

+---+------+
| i | rank |
+---+------+
| 0 |    1 |
| 1 |    2 |
| 2 |    3 |
| 7 |    8 |
+---+------+