按日期倒序分页时如何避免同日期数据遗漏或重复?
解决按日期倒序分页的重复/遗漏问题
当按mdate倒序分页时,仅用单一日期条件会出现要么遗漏同日期剩余数据、要么重复加载的问题,核心原因是同日期的记录没有明确的分页边界。可以通过复合条件+稳定排序的方式解决:
步骤1:设置稳定且唯一的排序规则
在查询中,除了按mdate desc排序,还要加上一个唯一标识字段(比如主键id)的排序,确保同日期的记录有固定的顺序:
select top 100 * from production order by mdate desc, id desc
(如果id是递增主键,用desc或asc都可以,只要后续分页查询保持一致即可)
步骤2:基于复合条件分页
不再仅依赖最后一条记录的mdate,而是同时记录最后一条的mdate和id,用复合条件筛选下一页数据:
假设上一页最后一条记录的mdate为'2023/10/03',id为123,下一页查询语句如下:
select top 100 * from production where (mdate < '2023/10/03') or (mdate = '2023/10/03' and id < 123) order by mdate desc, id desc
原理说明
通过mdate+唯一ID的组合,每个记录都拥有唯一的排序定位键:
- 条件
mdate < '2023/10/03'会加载所有早于目标日期的记录 - 条件
mdate = '2023/10/03' and id < 123会加载目标日期中,排序在最后一条记录之后的剩余数据
这样既不会遗漏同日期的未展示数据,也不会重复加载已经展示过的记录。
如果没有单一主键,也可以使用多个字段组成的联合唯一标识,只要能精准区分同日期的不同记录即可。
内容的提问来源于stack exchange,提问作者Ali Sheikhpour
相关产品推荐
相关产品推荐

