11
回答
mysql 滚动加载,分页算法
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

有这样一个场景,页面上滚动加载数据

1、前端:html javascript ajax , 后端:java mysql。

2、一共有20条数据,每次加载10条,sql写法是:select * from tab limit start , pageSize。start的值用pageNo * pageSize,加载完第一页后,从前10条中删除1条,由于start 的值还是 10,加载第二页时,就会数据不准确

对于类似问题,大家怎么处理的,使用的什么算法。

举报
JayeCoder
发帖于1年前 11回/593阅
共有11个答案 最后回答: 1年前
删除的时候直接刷新页面重新拿,多简单
--- 共有 6 条评论 ---
月生无界回复 @leo108 : 我不觉得有什么问题,就算别人把第一页全部删完了,那也最多是第二页变成拿第三页的,而且,可以随便删数据的话,那用户就应该做好这种体验准备,不然,你觉得,有好方法就说嘛 1年前 回复
leo108假如不仅仅是当前用户可以删除,其他用户也能删除的时候,你这个方法就懵逼了 1年前 回复
月生无界回复 @imeasyer : 从删除记录那一页开始,全部重新拿,多简单的事 1年前 回复
JayeCoder回复 @月生无界 : 再举个例子,如果我一共有三页数据,现在加载了两页,我要从第一页的数据里删除一条。 1年前 回复
月生无界回复 @imeasyer : 首先,你发请求拿数据是不是一页发一个请求,对吧,假如你第一页拿了,第二页也拿了,但是你在第二页删除数据,那么重新拿第二页就行了,局部刷新这种就不用说了吧,当然,如果已经拿了第三页,那么还是要重新拿第二第三页 1年前 回复

无解。

这个问题没有必要去纠结。

除非是你的不存在删除的功能,不然这个问题根本就没办法避免。

--- 共有 1 条评论 ---
shijacky我也觉得没必要纠结 1年前 回复

很简单,页面多加两个参数就好了,lastId和lastTime,lastId代表当前页面最后一项的自增id,lastTime代表当前页最后一项的更新时间,然后

select * from table where update_time <= $lastTime and id <> $lastId order by update_time desc

--- 共有 1 条评论 ---
leo108当然这种方法你需要给update_time加索引,不然表大的话会比较慢 1年前 回复

记录下来在页面上修改(这里是删除)了多少条记录,计算偏移量的时候把这个值减掉就行

select * from tb_xx where ... limit $limit offset $offset

$limit 是固定的

$offset 可以从 ($pageNum - 1) * $limit 计算得到

以你说的场景为例,第一页,$pageNum = 1, $limit = 10, $offset = 0

在第一页删除了一条数据,记下来$modCount=1,那么在翻第二页的时候

$offset = ($pageNum - 1) * $limit - $modCount = 9 不就是对了的么

要看你页面的排序方式,如果是根据自增主键排序的话就每次请求带上上次返回的最后一个id,然后取大于id的top 10即为下一页。此种方式适用于文章列表等按照时间线来排序的列表
顶部