2016-09-06 108 views
0

我想爲api/ajax做分頁, 如果使用第1頁,第2頁類型..可能是重複行,如果新行剛創建。找到索引/偏移基於特定的ID

所以我看到Instagram的API做以下嘗試,

第一個請求:
使用查詢1
讀第一行偏移參數爲零,並返回pagination數據AJAX請求下一

"pagination": { 
    "prev_end_id": .., 
    "count": ... 
} 

請求下一個:
使用查詢2
如果訂購idprice_numberinteger,我將返回prev_end_idprev_end_price,請檢查descasc,然後選擇更小或更大。
但是如果按namestring或其他類型的列排序,該怎麼做呢?

我是否正確,有沒有更好的方法來解決這個問題?

我應該忽略由列的順序,只是返回end_id
時要求下場,
找到抵消ID的基礎,然後做一樣的第一個請求?
是如何找到基於id的偏移量?
選擇所有行和循環行找到特定的id索引?聲音表現不佳......

1 
SELECT 
    p.* 
    FROM product p 
    ORDER BY p.id desc NULLS LAST OFFSET $1 LIMIT $2 
2 
SELECT 
    p.* 
    FROM product p 
    WHERE p.id < $1 
    ORDER BY p.id desc NULLS LAST LIMIT $2 

1 
SELECT 
    p.* 
    FROM product p 
    ORDER BY p.name desc NULLS LAST OFFSET $1 LIMIT $2 
2 
SELECT 
    p.* 
    FROM product p 
    AND p.price_number < $1 
    ORDER BY p.name desc NULLS LAST LIMIT $2 


CREATE TABLE IF NOT EXISTS "product"(
    "id" SERIAL NOT NULL, 
    "name" varchar DEFAULT NULL, 
    "name_slug" varchar DEFAULT NULL, 
    "price_number" numeric DEFAULT NULL, 
    PRIMARY KEY ("id") 
); 

回答

1

您應該使用鍵集分頁,因爲OFFSET是一個性能問題,如果有新的數據同時添加可能會導致奇怪的結果(如你觀察到的)。

如果sort_key是其結果是有序的領域,第一個查詢將是這樣的:

SELECT * FROM product 
ORDER BY sort_key 
LIMIT 50; 

然後你還記得最大的返回sort_key,不管它是一個整數或字符串,如<last_key>
你的第二個查詢看起來是這樣的:

SELECT * FROM product 
WHERE sort_key > <last_key> 
ORDER BY sort_key 
LIMIT 50; 

,並依此類推,直至完成。

爲了提高效率,請在sort_key上創建索引。

你可以找到這個方法描述here

+0

感謝您的回覆,這看起來與我的示例相同?我的問題是,如果列數據類型是字符串不是整數,那麼如何使它成爲sort_key user1775888

+1

是的,我有一個印象,你在你的問題中考慮過這種可能性,但你的例子很難閱讀,我認爲它是最好的明確。字符串應該沒有問題,該方法適用於允許比較的任何數據類型,並且字符串當然可以。 –

+0

非常感謝你,我會試試這個! – user1775888