2015-09-08 18 views
1

通常,在分頁SQL查詢時,我們使用偏移量和限制來選擇一行頁面。但是,如果在OFFSET之間插入或刪除一行,則在頁面請求之間,則對下一頁的請求將跳過行或複製先前的行。是否有可能在特定行之後查詢下一個n結果?

考慮像

SELECT id FROM t 
ORDER BY // a complex, dynamic order clause 
OFFSET ? LIMIT ? 
在以下情況下

查詢:

  1. 查詢與OFFSET=0 LIMIT=1
  2. 別人刪除什麼剛剛返回的第一行
  3. 查詢下一個OFFSET=1 LIMIT=1

應該在#3中返回的行實際上將被OFFSET=1隱藏。

如果有一種方法可以避免這種情況,「給我下一行m行後面的id = [last row's id]」而不是「skip n rows,然後給我m行」 。有沒有一個運營商在MySQL中這樣做?基本上,我正在尋找CouchDB的startkey

回答

2

當然。如果你在排序三列ORDER BY a, b, c,知道你顯示的最後一個記錄共進值a0, b0, c0這些列與PK id0那麼你可以做這樣的事情:

WHERE (a, b, c, pk) > (a0, b0, c0, id0) 
ORDER BY a, b, c, pk 
LIMIT m -- don't bother with offset anymore 
+0

哦,那將完全正常工作。我在迴避這個解決方案,因爲我認爲order-by子句必須在客戶端代碼和SQL中重複,但這是不正確的。客戶端通過訂單條件,服務器同時創建訂單子句和where子句。 –

+0

@DanRoss:如果你有一些列按升序排序而其他按降序排列,那麼你會有點混亂,因爲你需要將過濾器拆分成WHERE a> a0 OR(a = a0 AND b eggyal

相關問題