我有一张帖子。我显示按时间降序组织的帖子列表,每个页面限制为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所在的行号。但我不确定这是否正确或如何做到这一点。
答案 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
是一个运行总计。