需求:需要在APP开发一个类似评论审核的功能,当点击审核通过时,此评论从审核列表之中清除.列表根据审核的创建时间倒序
难点:当清除的之后,会对后续分页的结果产生影响
如操作前分页结果
(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D E F
3, G H I
待请求
4, J K L
接下来,我们将第二页之中的 E数据清除
结果变为
期望
(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D F
3, G H I
待请求
4, J K L
实际
(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D F G
3, H I
待请求
4, K L M
没有返回的数据
K
当我们在请求数据的时候,会跳过原本应该在第四页输出的
本博文只适用于操作完,被操作的数据不再出现在列表内。
表字段 | 字段含义 |
---|---|
id | id主键 |
userId | 用户id |
status | 状态 1 未审核 2 审核成功 |
create_time | 创建时间 |
基本SQL
SELECT * FROM t WHERE userId=XXX AND status=1 ORDER BY create_time LIMIT xx , xx
方案基本逻辑:
将上一条排序在末尾的数据,他的ID作为查询条件,一次性最多取十条。
适用范围:
存在一个可以排序的id
具体方案:
SELECT * FROM t WHERE userId=XXX AND status=1 AND id > #{minId} ORDER BY create_time LIMIT 10
但是,我们当前排序的逻辑却是使用create_time,因此单纯使用 miniId 却是与我们的逻辑不符
因此,我们便需要使用两个字段进行排序字段create_time 与 id 。
此方案不能使用一条SQL解决,需要使用两条SQL
SELEC * FROM t WHERE userId=XXX AND id > `#{minId}` AND AND status=1create_time=`#{create_time}` ORDER BY create_time , id LIMIT 10
# 确定上条SQL条数,变量为num
if( num > 0 ){
SELECT * FROM t WHERE userId=XXX AND status=1 AND create_time > `#{create_time}` ORDER BY create_time ,id LIMIT num
}
方案基本逻辑:
将被操作的数据作为额外参数传入,在排序的时候便可以将被操作的数据一起进行排序
方案适用范围:
操作后的数据,其排序字段并不会被修改
如: 在领取后,并不会对排序字段create_time进行修改
当前查询之中拥有额外可作为索引的字段
在查询SQL之中存在查询条件 userId=XXXX
6
具体方案:
简单方案:
将SQL修改为
SELECT * FROM t WHERE userId=XXXX AND (status=1 OR id IN (XXX)) ORDER BY create_time LIMIT XX , 10
方案基本逻辑:
方案适用范围:
当前屏幕无法一次性加载单页内的所有数据。若屏幕能展示,单页内的所有数据。则会有很明显的数据较少的样式