我有一个(游戏)排行榜表,其中包含一个由另一个查询更新的排名。它以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条记录?我确实认为您可以有目的地获得比所需更多的记录,然后修剪掉不需要的记录。虽然我不知道如何通过查询执行此操作!

任何帮助表示赞赏:)

最佳答案

您可以巧妙地使用order bylimit来做到这一点:

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;

关于mysql - 确保从MySQL查询返回正确的行数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23390268/

10-13 07:40
查看更多