2016-09-06 109 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