1

我意识到我可以在代码中做到这一点,但我很好奇除了您的查询匹配的结果之外,是否还有一种直接的 SQL 方法来选择(例如)10 个结果......

所以,假设我有一个所有球员都有分数的数据库,我想向用户展示分数落后于他们的 5 名球员和领先的 5 名球员......所以,我选择了他们的行,但现在我应该只使用或在 where 子句中并说类似...

select score as selectedScore from player_scores where playerId = xxxx
or (score > selectedScore - 5 and score < selectedScore + 5)

我意识到这意味着所有分数都是按确切顺序排列的,我会修改查询以从这些分数中提取 userId,所以这只是一个伪示例。

我怀疑这会起作用,但这是处理这个问题的正确方法吗?

4

1 回答 1

1

您可以使用UNION组合两个查询,分别使用ORDER BYLIMIT选择下一个 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
)
于 2012-06-05T23:32:24.230 回答