2014-04-30 49 views
0

我有一个(游戏)排行榜表,其中包含由另一个查询更新的排名。它以ID为中心 - 当我查询表时,我最好想要取回N条记录。所以,我已经做了UNION在记录都与限制N/2,像这样:确保从MySQL查询返回正确的行数

(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条记录?我确实认为你可以有目的地获得比需要更多的记录,然后修剪你不需要的记录。虽然我不知道如何用查询来做到这一点!

任何帮助表示赞赏:)

回答

3

你可以用一个巧妙的运用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; 
+0

很好的答案!干杯。 –

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 

查看manual了解更多信息。

+0

我确实尝试了这种方法,但是这样做不能修整下半部分并只返回顶部查询? –