从 Postgresql 检索固定范围的行

Ash*_*win 2 postgresql view select

我有一个疑问:

select qid,ansid,ans from table1 where askerid='something'
Run Code Online (Sandbox Code Playgroud)

此查询可以检索许多行。但我想一次只显示 50 行,然后如果用户单击more,则应检索接下来的 50 行。我想到了这样的查询:

select qid,ansid,ans 
from table1 
where askerid='something' 
limit 100
minus 
select qid,ansid,ans 
from table1 
where askerid='something' 
limit 50
Run Code Online (Sandbox Code Playgroud)

我想知道这是否是一个良好的查询性能和替代查询,其性能优于上述查询。

Phi*_*lᵀᴹ 6

正确的方法是使用LIMITand OFFSET

请注意,为了使其正常工作,您的查询将需要一个ORDER BY子句,以便每次以相同的顺序获取行。

您的第一个查询是:

SELECT qid,ansid,ans 
FROM table1 
WHERE askerid='something'
LIMIT 50 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

第二个查询的OFFSET值为 50,因为您想跳过前 50 行:

SELECT qid,ansid,ans
FROM table1 
WHERE askerid='something' 
LIMIT 50 OFFSET 50
Run Code Online (Sandbox Code Playgroud)

ORDER BY子句要在WHEREandLIMIT子句之间添加。

Postgres 文档在这里,并提到这对于大OFFSET值可能没有性能。如果该ORDER BY列已编入索引,那么对于小型数据集就可以了。