我遇到了这个小问题: 我想用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 |
+-------+------+--------+
那么,有一种方法可以在一个查询中完成吗?
谢谢!
答案 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 |
+---+------+