我意识到我可以在代码中执行此操作,但我很好奇是否有一种直接的SQL方式来选择(例如)10个结果以及查询匹配的结果...
所以,假设我有一个玩家数据库,所有玩家都得分,我想向用户展示5个玩家,他们的得分落后于他们和5个未来...所以,我选择了他们的行,但现在我应该只需使用或在where子句中说出类似......
select score as selectedScore from player_scores where playerId = xxxx
or (score > selectedScore - 5 and score < selectedScore + 5)
我意识到这意味着所有分数都是按照确切的顺序排列,我会修改查询以从这些分数中提取userIds,所以这只是一个伪示例。
我怀疑这会起作用,但这是解决这个问题的正确方法吗?
答案 0 :(得分:1)
您可以使用UNION
组合使用ORDER BY
和LIMIT
的两个查询分别选择下一个5和前一个5;通过在每个查询中使用自联接,可以找到与所需玩家的分数相邻的所有其他玩家(这假设playerId
中的player_scores
是唯一的):
(
SELECT p1.playerId, p1.score
FROM player_scores AS p1 JOIN player_scores AS p2 ON p1.score >= p2.score
WHERE p2.playerId = ?
ORDER BY p1.score ASC
LIMIT 6
) UNION ALL (
SELECT p1.playerId, p1.score
FROM player_scores AS p1 JOIN player_scores AS p2 ON p1.score < p2.score
WHERE p2.playerId = ?
ORDER BY p1.score ASC
LIMIT 5
)