基于最后修改的属性进行排序时的分页问题

时间:2014-02-18 07:03:26

标签: mysql sql sql-server postgresql pagination

我需要显示一些基于修改列排序的记录(最新活动) (在顶部发布新的编辑或评论)

App UI有像'更多'的推文按钮,用于无限滚动。每个'more'将向UI添加下10条记录。

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

例如,

假设我在作业表中有记录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重复。我可以通过不将J插入UI来隐藏它,但更多按钮将只显示9条记录。但是,当更新大量记录时,此机制会失败,如果修改了10条记录,查询将再次返回A-J

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

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

查询的服务器缓存?

2 个答案:

答案 0 :(得分:2)

我会做一个NOT IN()和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不断匹配。

答案 1 :(得分:1)

Twitter时间轴没有被ID查询的分页查询

此页面将帮助您了解时间轴基础知识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