基于ID和Timestamp的游标分页:获取下一页需同时使用两者吗?
关于数据表分页是否必须同时传入ID和时间戳的问题
我正在参考一篇回答实现数据表分页,想请教:获取下一页是否必须同时传入ID和时间戳?我构思的SQL语句如下:
select * from my_table where (date_created, id) < ((select date_created from my_table where id = 1234), 1234) order by date_created, id desc limit 10
不一定必须同时传,但强烈建议这么做,核心原因有两个:
- 避免时间戳重复导致的数据异常:如果多条记录的
date_created完全相同,仅靠时间戳分页会出现跳页或重复加载的情况。比如有15条记录时间戳一致,第一页取10条后,下一页用date_created < 目标值会漏掉剩下5条,因为它们的时间戳并不小于目标值。 - 保证排序的绝对确定性:数据库对相同时间戳的记录排序规则是不确定的(除非指定唯一排序键),加入唯一主键ID后,
(date_created, id)的组合是全局唯一的,能确保每次分页的顺序完全一致。
你写的SQL逻辑是通顺的,但可以优化写法或调整细节:
- 如果你用的数据库对行比较支持有限,可以改成显式的条件判断,可读性更好:
select * from my_table where date_created < (select date_created from my_table where id = 1234) or (date_created = (select date_created from my_table where id = 1234) and id < 1234) order by date_created desc, id desc limit 10;
- 注意排序方向要和筛选条件匹配:你原SQL里排序用了
date_created, id desc,但筛选条件是(date_created, id) < (...),建议统一成降序,逻辑更自洽:
select * from my_table where (date_created, id) < ((select date_created from my_table where id = 1234), 1234) order by date_created desc, id desc limit 10;
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

