2014-06-27 30 views
0

我正在使用MySQL,它支持OFFSET和LIMIT,非常棒。 但是如果我想查詢第一行等於特定的主鍵而不是頁面索引呢?如何用特定PK的起始行編寫SELECT查詢?

例如我有一個表:

ID NAME HEIGHT 
1 kevin 1.67 
2 bob 1.82 
3 jane 1.70 
4 wayne 1.59 

我希望人們順序表與第一頁的最後一個ID的高度ASC爲1,整體觀點是4 1 3 2(頁大小= 2)

東西想:

SELECT ID,NAME,HEIGHT FROM table OFFSET ???? LIMIT 2 ORDER BY HEIGHT ASC 

所以我應該得到:

3 jane 1.70 
2 bob 1.82 
+1

很確定'ORDER BY'需要在**'OFFSET'和'LIMIT'之前來**。在任何情況下,您的偏移量只是頁碼乘以頁面大小(-1代表基於零的偏移量) – Phil

+1

除了獲取特定行(或進行排序)之外,不應使用「id」穩定,因爲它是一個獨特的關鍵)。這些值不重要,而且很少相關。如果你試圖按下標準(所以理論上你不需要'OFFSET'),你的'WHERE'子句需要看起來像'WHERE height>:previousHeight OR(height =:previousHeight AND id> :previousId)''(這個假設''id'已被添加到'ORDER BY'中以使相同的'height'值的順序穩定,我們實際上並不關心它的值是什麼)。 –

+0

@ Clockwork-Muse thx的建議,我的問題是,我的客戶只是要求'加載更多'的行動,並給我在列表底部的最後一個ID,這幾乎就像在Youtube上加載評論,每次我得到最後一次評論的ID,我如何實現這個? –

回答

0

剛發現的溶液。 請求必須包括id和排序因子(在我的情況下它是height)。這樣查詢應該是這樣的:

SELECT * FROM table WHERE (t.height = last_height AND t.id > last_id) OR t.height > last_height ORDER BY t.height ASC, t.id ASC LIMIT 2 

如果有多人以相同的高度,id可以用來針點的起始行。

非常感謝Clockwork-Muse照明燈泡!

1

試試這個

邏輯:

page_size page_number OFFSET 
    2   1   (2*1)-1 = 1 
    2   2   (2*2)-1 = 3 
    2   3   (2*3)-1 = 5 

查詢:

SELECT ID,NAME,HEIGHT 
FROM table 
ORDER BY HEIGHT ASC, ID ASC 
LIMIT 2 OFFSET (page_size * page_number)-1 
+1

您需要在ORDER BY中添加一個唯一的列,以確保穩定的排序順序(唯一的鍵對此很有用,而且它屬於該子句的次數很少)。 –

+0

邏輯就在這裏,如果我沒有'page_number'可用? –

+0

你必須學習PHP中的分頁檢查鏈接http://www.phpeasycode.com/showdemo.php?target=/pagination/demo.php – Sadikhasan