0

我有一个(游戏)排行榜表,其中包含一个由另一个查询更新的排名。它以 ID 为中心——当我查询表时,理想情况下我想取回 N 条记录。因此,我对记录都进行了 UNION,限制为 N/2,如下所示:

(SELECT * FROM test1 t WHERE t.rank > (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank LIMIT 0, N/2)
UNION ALL
(SELECT * FROM test1 t WHERE t.rank <= (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank desc LIMIT 0, N/2) ORDER BY rank

虽然这在排行榜顶部时不太有效,但它只会返回较低的 N/2。有没有办法确保它总是返回 N 条记录?我确实认为您可以有目的地获取比要求更多的记录,然后删除您不需要的记录。虽然我不知道如何通过查询来做到这一点!

任何帮助表示赞赏:)

4

2 回答 2

3

您可以巧妙地使用order byand来做到这一点limit

SELECT t.*
FROM test1 t cross join
     (SELECT rank FROM test1 t2 WHERE id = @ID) as theone
ORDER BY ABS(theone.rank - t.rank)
LIMIT N;

然后,您可能希望这些按顺序排列:

SELECT t.*
FROM (SELECT t.*
      FROM test1 t cross join
           (SELECT rank FROM test1 t2 WHERE id = @ID) as theone
      ORDER BY ABS(theone.rank - t.rank)
      LIMIT N
     ) t
ORDER BY t.rank;
于 2014-04-30T14:06:40.993 回答
0

尝试以下方法:

(SELECT * FROM test1 t WHERE t.rank > (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank LIMIT 0,N)
UNION ALL
(SELECT * FROM test1 t WHERE t.rank <= (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank desc LIMIT 0,N)
ORDER BY rank
LIMIT 0,N

有关更多信息,请参阅手册

于 2014-04-30T14:08:42.860 回答