问题描述:
对于分页查询,传统的写法是这样的:
select * from user limit 0, 4 order by id;
这样存在的问题是 若数据库的数据不断的更新, (默认倒序显示到前台),则前台 点击下一页时 则会 显示出已经显示过的重复的数据(脏数据), 原因是 不断新插入(或 删除)的数据 导致数据的动态变化,MySQL的limit 的每次执行,都 实时的得到了最新的查询结果, 导致数据的重复,
解决:
既然 脏数据是由于查询时总是查出来 动态的最新的数据,那么 我们可以想办法 让查出来的数据 不是’最新的’.即不是’实时的’…
具体思路:
若想避免 由插入,删除对查询结果集造成影响,则需要利用上一次的查询结果作为下一次的查询条件:
-
例 以id(id为自增长)倒序排列,记录下最大的id,下次分页查询(即点击下一页)时,以这个记录下的id作为限定条件查询数据,
缺点是用户无法获得实时更新的数据,除非刷新网页.
select * from table where id>0 limit 0, 4 order by id
id倒序查询, 点击 下一页 ,前台传参: 所查询数据的id的最小值
select * from table where id < minID limit 20 order by id
id倒序查询, 点击 上一页 ,前台传参: 所查询数据的id的最大值select * from table where id > maxID limit 20 order by id
-
改进:(针对下拉式分页),
在前端实时显示最新的数据(需要在后台写代码进行数据的推送),前端将最新的数据拼接到页面的下面,用户下拉到页面的底端时再查询下一页数据,此时因为最新的数据已经在页面显示过了,只要查询非最新的数据,同样以上例中查询的最大id最为限制条件,但是sql语句(以mysql为例)的limit关键词后面接的两个参数中的第一个要做处理,需要加上前台传递实时显示的最新数据的条数. -
另一种实现:
在每次请求的时候都带上前台传过来的最后一条数据在数据库的插入时间,然后查询的时候添加另一个条件:
插入时间小于该时间,这样每次返回的都只需要返回第一页的数据就可以了