按日期时间字段准确分页

时间:2013-03-15 11:22:39

标签: mysql database architecture web pagination

我有一个数据库表,例如'items'。我有这些项目的时间表,按字段ascended_at(datetime)排序。我需要为这样的时间表制作一个分页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订购呢?
  • 还有什么想法?

1 个答案:

答案 0 :(得分:0)

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

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

修改

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

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

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