作者:流域 | 来源:互联网 | 2023-10-10 08:49
目录
问题描述
问题表现
问题原因
解决方法
问题描述
- 使用laravel做分页列表查询接口,每页返回5条数据,
- 发现请求1页,2页最后一条数据出现重复,
- 而总数据量不变,导致有一条数据被覆盖。
问题表现
第一页请求参数如下:
返回数据如下:
第二页请求参数如下:
返回数据如下:
有一条数据缺失了,即:
问题原因
1.经查询数据库表,该数据确实存在
那明显就是业务实现有误。
2.对业务实现sql进行排查并测试,发现最终原因是排序导致。
实现代码如下:
$data = $conn->skip($offSet)->take($count)
->orderBy('is_expire', 'desc')
->orderBy('overtime', 'asc')
->getArray($key);
这一类的问题,隐藏比较隐秘,即当is_expire,overtime这两个参数都相等的多条数据存在时,
才会出现数据重复显示问题。数据表查询没有一个决定性的排序条件,多条数据比较条件一致,
则会认为返回哪个都一样,最终就出现第一二页有一条重复数据。
解决方法
在排序的两个条件之后,在加一条决定性的排序条件,使每一条数据都是唯一的,这样就不会有数据被覆盖情况出现。
实现代码如下:
$data = $conn->skip($offSet)->take($count)
->orderBy('is_expire', 'desc')
->orderBy('overtime', 'asc')
->orderBy('id', 'asc') # 增加id排序
->getArray($key);
在这里记录一下,以备查阅,毕竟好记性不如烂笔头。虽然问题解决容易,但是不暴露也无法解决,尤其当一个业务没有问题且需求不变的时候,我们通常不会去查看它,还是从平时开发时注意细节入手吧。