2014-04-30 65 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

我確實嘗試了這種方法,但是這樣做不能修整下半部分並只返回頂部查詢? –