我的行显示在哪个页面上?

时间:2014-08-13 21:54:34

标签: python sql postgresql pagination sqlalchemy

我有一张帖子。我显示按时间降序组织的帖子列表,每个页面限制为20行。我如何确定ID所在的特定行的页面是什么,以便我可以链接到该特定页面。

post

CREATE TABLE post
(
  id serial NOT NULL,
  text character varying(1000),
  created_date timestamp without time zone,
  CONSTRAINT post_pkey PRIMARY KEY (id)
)

当前

select * from post order by created_date desc limit 20 offset 0

ID X上的页面是什么?我的理论是,当您按照特定的'顺序选择时,我可以返回ID所在的行号。但我不确定这是否正确或如何做到这一点。

2 个答案:

答案 0 :(得分:0)

我建议在子查询中使用window function row_number()

SELECT rn / 20 + 1 AS page  -- 20 rows per page
FROM  (
   SELECT id, row_number() OVER (ORDER BY created_date DESC) AS rn
   FROM   post
   ) sub
WHERE id = 123;

通常的免责声明:如果基础数据发生变化(同时发生),页码可能会发生变化。

答案 1 :(得分:0)

如果您想要一个链接,并且created_date始终是插入current_timestamp,那么可以计算serial ID

select count(*) / 20 + 1 as page
from post
where id >= %(id)s

为了让current_timestamp更容易created_date使其成为默认

created_date timestamp default current_timestamp

可以使其成为约束

created_date timestamp default current_timestamp check(created_date = current_timestamp)

如果您需要链接列表,请将ID作为Python列表传递给查询

select *
from (
    select id, count(*) over(order by id desc) / 20 + 1 as page
    from post
    where
        id >= (
            select id
            from unnest(%(ids_list)s) s
            order by id
            limit 1
        )
) s
where id = any (%(ids_list))s

在最后一个查询中,count是一个运行总计。

SQL Fiddle