【问题标题】:On what page is my row displayed?我的行显示在哪个页面上?
【发布时间】:2014-10-07 10:38:37
【问题描述】:

我有一个帖子表。我显示按时间降序组织的分页帖子列表,每页限制为 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 在哪个页面上?我的理论是,当您通过特定的“order by”选择时,我可以返回 id 所在的行号,但我不确定这是否正确或如何做到这一点。

【问题讨论】:

    标签: python sql postgresql pagination sqlalchemy


    【解决方案1】:

    如果您想要单个链接并且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

    【讨论】:

      【解决方案2】:

      我建议在子查询中使用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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        相关资源
        最近更新 更多