2

我试图在某个行标准之前和之后仅选择相邻的 N 行和 M 行,以获得专注于用户个人分数的高分表(与具有相似分数 N 以上和 M 以下的玩家相比)。

分数
--------
编号:整数
用户名:varchar(120)
分数:整数

注意:每个用户名都有多个分数。高分数据库只是一个分数转储

因此,要获取前 10 名的全球分数:SELECT max(score),username FROM scores GROUP BY username, ORDER BY score DESC

但是,我正在尝试为任何任意用户执行此操作 - 其中大多数都没有幸运地进入前 10 名......

如何引用某个用户分数的上方 N 行和低于某个用户分数的 M 行,以便在用户分数上方和下方拉出 10 个分数?

4

1 回答 1

3

要获得高于用户的 N 个结果,假设所有分数都是不同的:

select s.*
from scores
where s.score > (select s.score from scores where username = $username)
order by score desc
limit N;

要获得低于给定用户分数的 M 分数:

select s.*
from scores
where s.score < (select s.score from scores where username = $username)
order by score asc
limit M;

拥有相同的分数会带来一些挑战。下面将上述两者与 a 结合起来union all,解决了这个问题:

(select s.*
 from scores s cross join
      (select * from scores where username = $username) u
 where s.score > u.score or
       s.score = u.score and s.id > u.id
 order by s.score desc, s.id desc
 limit N
) union all
(select s.*
 from scores s cross join
      (select * from scores where username = $username) u
 where s.score < u.score or
       s.score = u.score and s.id < u.id
 order by s.score, s.id
 limit M
)
于 2013-10-31T23:29:13.523 回答