【问题标题】:Accurate pagination by datetime field按日期时间字段准确分页
【发布时间】:2023-03-03 08:06:23
【问题描述】:

我有一个数据库表,例如“items”。我有这些项目的时间表,按字段 assended_at(日期时间)排序。我需要为这样的时间线制作一个分页 api。所以,我的第一个版本是:

HTTP GET /items/timeline?page=[PAGE_NUM]

触发

SELECT * FROM items LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at;

但问题是:当新商品到达时,所有页面每 1 件商品就会移动。为了避免这种情况,我添加了 from_asc_at 参数:

HTTP GET /items/timeline?page=[PAGE_NUM]&from_asc_at=123123123

触发

SELECT * FROM items WHERE ascended_at <= [asc_at_parameter] LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at;

但这并不准确,因为可能有两个项目具有相同的ascended_at,并且您可以在两个不同的页面中看到相同的项目(但不应该)。

所以,我的问题是:有哪些可能的解决方案?

  • 使用 ID(因为它是唯一的)?但是如果不是按ID排序呢?
  • 还有什么想法吗?

【问题讨论】:

    标签: mysql database architecture web pagination


    【解决方案1】:

    如果您的项目 ID 是自动递增的,您可以在第一次检索项目时(在分页之前)检查下一个“自动递增”值。

    将该值永久存储(可能在会话变量中)直到下一次搜索,并在您的 SQL 查询中添加过滤器 &lt; {maximumID},以提高用户分页时的“结果集稳定性”(在不会检索初始搜索和分页)。

    编辑

    要处理项目删除,您必须执行“软删除”:不要立即从数据库中删除项目,而是将删除日期存储在日期时间字段中,以便项目仍然存在于DB 一段时间。

    当发出新的搜索时,您将在会话中存储当前服务器时间,并添加一个条件(例如date_deleted IS NULL OR date_deleted &gt; {searchDate}),以便在搜索后删除的所有项目仍将针对该特定搜索显示。

    您必须创建一个计划作业,以便在延迟一段时间后“真正”从数据库中删除项目。

    【讨论】:

    • 在我看来,它不处理删除项目
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多