如果您不需要输出中的排名(并且它在您的评论和喜欢的答案中显示出来,而您并不需要),则可以简单地组合最接近Jan得分的测验得分:
-- XXX this assumes `scores`.`username` is UNIQUE !
SELECT * FROM (
-- Get those who scored worse (or tied)
( SELECT s.*
FROM scores s
CROSS JOIN (SELECT score FROM scores WHERE username = 'Jan') ref
WHERE s.score <= ref.score AND username <> 'Jan'
ORDER BY s.score DESC
LIMIT 2)
UNION
-- Get our reference point record
(SELECT s.* FROM scores s WHERE username = 'Jan')
UNION
-- Get those who scored better
( SELECT s.*
FROM scores s
CROSS JOIN (SELECT score FROM scores WHERE username = 'Jan') ref
WHERE s.score > ref.score AND username <> 'Jan'
ORDER BY s.score ASC
LIMIT 2)
) slice
ORDER BY score ASC;
(请注意,由于示例数据集太小,我将结果限制为1月之前的两个记录和1月之后的两个记录。)
为了使LIMIT和UNION可以一起使用,需要在上面的组成查询上加上这些括号。然后,最外面的查询使我们可以对UNION的结果进行ORDER排序。