如果您不需要输出中的排名(并且它在您的评论和喜欢的答案中显示出来,而您并不需要),则可以简单地组合最接近Jan得分的测验得分:
查询(此处为SQL Fiddle):
-- 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)) sliceORDER BY score ASC;
(请注意,由于示例数据集太小,我将结果限制为1月之前的两个记录和1月之后的两个记录。)
为了使LIMIT和UNIOn可以一起使用,需要在上面的组成查询上加上这些括号。然后,最外面的查询使我们可以对UNIOn的结果进行ORDER排序。



