【问题标题】:Pagination issue while sorting based on last modified property根据上次修改的属性进行排序时出现分页问题
【发布时间】:2014-03-17 18:37:21
【问题描述】:

我需要显示一些根据修改后的列排序的记录(顶部的最新活动) (顶部有新编辑或 cmets 的帖子)

应用程序 UI 具有类似“更多”发布按钮的 twitter,用于无限滚动。每个“更多”都会将接下来的 10 条记录添加到 UI。

问题是当任何要显示的记录被修改时分页索引中断

例如 假设我在工作表中有记录 A,B,C,..Z

我第一次向用户显示记录 A-J 使用

SELECT * FROM Jobs WHERE 1 ORDER BY last_modified DESC LIMIT 0, 10

如果没有记录被修改,则第二次

SELECT * FROM Jobs WHERE 1 ORDER BY last_modified DESC LIMIT 10, 10

将返回K-T

但是,如果在用户点击“更多按钮”之前,有人修改了J 之后的任何记录,

SELECT * FROM Jobs WHERE 1 ORDER BY last_modified DESC LIMIT 10, 10

将返回J-S

此处记录J 重复。我可以通过不在 UI 中插入 J 来隐藏它,但更多按钮将只显示 9 条记录。但是这种机制在更新大量记录时失效,如果修改了10条记录,查询会再次返回A-J

处理这个分页问题的最佳方法是什么?

如果记录有多次更新,则保留第二个时间戳失败。

查询的服务器缓存?

【问题讨论】:

  • 您使用的是哪个数据库?
  • SQL Server,但问题并非特定于任何数据库

标签: mysql sql sql-server postgresql pagination


【解决方案1】:

我会做一个 NOT IN() 和一个 LIMIT 而不是一个带有预设偏移量的直接 LIMIT。

SELECT * FROM Jobs WHERE name NOT IN('A','B','C','D','E','F','G','H','I','J') 
ORDER BY last_modified DESC LIMIT 10

这样您每次仍然可以获得最近的 10 个,但您需要跟踪已显示的 ID 并不断与您的 sql 查询中的 ID 进行否定匹配。

【讨论】:

  • 我们如何处理分页?如果插入新记录,它将显示在破坏排序顺序之间
  • 如果您专门跟踪所有已显示的 ID 并对这些 ID 进行 NOT IN 匹配,您将获得一个结果集,即 10 个最近更新的记录,它们不在首页结果。是的,第 2 页上的这些结果可能会比第 1 页上的帖子更新,但您已经看到了这些结果,并且这些结果是负匹配的。基本上每个页面都是 10 个最新更新,不包括已经看到的更新。它适合您尝试做的事情,但在代码方面管理可能会很痛苦。
  • 您可以按创建时间过滤它们。
【解决方案2】:

Twitter 时间线不是分页查询,它们是通过 ids 查询的

此页面将帮助您了解时间线基础知识https://dev.twitter.com/docs/working-with-timelines

假设每列也有 id 字段

id msg
1  A
2  B
....

第一个查询将为您提供 10 个帖子,最大 post_id 将为 10

下一个查询应该是

SELECT * FROM Jobs WHERE id > 10 ORDER BY last_modified DESC LIMIT 0, 10

【讨论】:

  • 在 twitter 中处理过的推文永远不会更新。如果某些要处理的记录被修改,since_id 或 max_id 方法将不起作用。
  • 你能解释一下你原来的问题,你希望总是刷新表格有分页吗?
  • AZ 列表是最后修改的排序查询的结果,它可以有类似 A[5]、B[6]、c[2]、D[15]、E[22].. .. 所以 id > 10 将不起作用
  • 我想我不明白你在做什么,但如果我做对了,为什么不使用 last_modified 而不是 id ?
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多