mysql - 按日期时间字段准确分页

标签 mysql database architecture web pagination

我有一个数据库表,例如“items”。我有这些项目的时间表,按字段 ascended_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 排序怎么办?
  • 还有什么想法吗?

最佳答案

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

持久存储该值(可能在 session 变量中)直到下一次搜索,并添加过滤器 < {maximumID}到您的 SQL 查询,以提高用户分页时的“结果集稳定性”(将不会检索在初始搜索和分页之间创建的所有新项目)。

编辑

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

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

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

关于mysql - 按日期时间字段准确分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15431122/

相关文章:

database - PostgreSQL创建表空间没有权限

java - 使用具有外键约束的 JPA 删除对象

javascript - 编写硬核 javascript 应用程序的成功途径是什么?

.net - 企业规模的 DDD?

architecture - CouchDB: "Database-per-user"还是 "One-Database-For-All"设计?

php - 检索 MySQL 值并打印它们

Mysql插入列名称是(从同一个表的另一列中选择值)

php - 每个 mysql 结果的删除按钮

php - 为时间戳设置列数据类型,从 PHP 到 MySQL

php - 我想构建一个为用户提供在线数据库的离线版本的应用程序