一、背景
分页查询一般的实现方式是:输入当前页码page以及每页数量size,再加上其他的查询条件。
比如:查询第一页,page=0, size=10, 如果返回的数据集小于10,说明当前页是最后一页。
反之,如果有下一页,则page++,size不变。
这当然是常规的一种分页查询实现。
本文我们将要通过时间戳机制实现另外一种分页查询。
二、时间戳机制
要想实现时间戳机制的分页查询,前提是分页查询的排序条件是创建时间或更新时间。
这里以更新时间为例:
- 查询第一页,按更新时间倒序排列,时间戳传0
- 当要上拉查询下一页的时候,时间戳传最后一条记录的更新时间。
- 当下拉刷新的时候,时间戳则传入第一条记录的更新时间。
这种分页查询的入参包括
- 1、type: 0-下拉(上一页); 1-上拉(下一页)
- 2、timestamp: 时间戳,可能取最后第一条记录的更新时间,也可能是第一条记录的更新时间。
- 3、每页数量size
- 4、其他查询条件
三、分页查询的实现
伪代码
if (type == 0) {
where updateTime > ${timestamp} and ...(其他查询条件)
} else if (type == 1) {
where updateTime < ${timestamp} and ...(其他查询条件)
}
// 按更新时间倒序排列
// 每页数量
order by updateTime desc limit {size}
四、总结
这种分页查询,以时间戳为增量更新的标记,好处是,不用去组装分页语句,只需要传入每页数量,不用根据当前页码和每页数量而计算。
使用时,需要注意的是,如果记录的更新时间频繁更新,会导致结果一会在当前页,一会在上一页。(因为在你刷新页面的时候,该记录正好更新了)
所以,客户端不要缓存上一次的查询结果集,如果要,那也得区分用户是下拉刷新还是上拉查询。
总之,要小心同一个记录被重复出现在次增量查询的结果集里。
如果是以创建时间为准,然后时间戳对比创建时间来增量查询,那么就不会出现这个问题了。