【问题标题】:Is there a way to select results after a certain id in an order list?有没有办法在订单列表中的某个 id 之后选择结果?
【发布时间】:2019-02-19 17:42:33
【问题描述】:

我正在尝试根据 Postgres 数据库中的数据实现基于光标的分页列表。

例如,假设我有一个包含以下列的表格:

id | firstname | lastname

我想对这些数据进行分页,如果我只想按 id 对其进行排序,这将非常简单,但就我而言,我希望选择按姓氏排序,并且可以保证有多个人使用同姓。

如果我有如下的选择语句:

SELECT * FROM people
ORDER BY lastname ASC;

在这种情况下,我可以让我的编码光标包含有关 lastname 的信息,这样我就可以从我离开的地方继续,但由于会有多个用户具有相同的姓氏,这将是错误的。 SQL 中有没有办法只在有序列表中的某个 id 之后获取结果,而不是排序结果的列?

select 语句的示例结果:

1 | John  | Doe
4 | John  | Price
2 | Joe   | White
6 | Jim   | White
3 | Sam   | White
5 | Sally | Young

如果我想要页面大小为 3,我无法添加 WHERE lastname <= :lastname,因为我会在列表中有重复的数据,因为它会在调用期间返回 ids 2、6 和 3。在我的情况下,如果我可以在查询中添加类似于 AFTER id = 6 的内容会很有帮助,它可以跳过所有内容,直到在有序列表中找到 id

【问题讨论】:

    标签: sql postgresql sorting pagination


    【解决方案1】:

    是的。如果我理解正确:

    select t.*
    from t
    where (lastname, id) > (select t2.lastname, t2.id
                            from t t2
                            where t2.id = ?
                           )
    order by t.lastname;
    

    我想我会在组合中添加firstname,但这是相同的想法。

    【讨论】:

      【解决方案2】:

      limit 和 offset 用于分页,例如:

      SELECT id, lastname, firstname FROM people Order by lastname, firstname, id Offset 0 Limit 10 这会将您带到第 10 行,要检索下一页,您需要将偏移量指定为 10

      这里的文档: https://www.postgresql.org/docs/9.6/static/queries-limit.html

      【讨论】:

      • 不幸的是,这在我的情况下不起作用。我有太多动态数据,这使得使用限制和偏移太容易出错。
      • 我明白了,如果你的表会有很多行,我会更喜欢传递三个值(姓氏、名字、id)而不是子选择,执行起来会更便宜
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2023-02-02
      • 2021-04-22
      相关资源
      最近更新 更多