sql进行Order by排序再进行分页limit取值会出现重复显示问题

在实际开发中遇到一个有趣的问题,有关数据库order by排序不唯一,导致分页出现重复数据问题。这个问题还是有点特殊的。因为数据库研究的少这个问题挺让我困惑。为了解决它找了很久的错误。

首先介绍一下问题的出现情况。项目中需要对所有客服处理的会话进行时间段的排序显示并且分页显示每页取值20条。时间段按小时计算。

初始数据查询:select * from T_SEAT_MSG order by time desc;

sql进行Order by排序再进行分页limit取值会出现重复显示问题_第1张图片

操作:首先进行数据库的查询取数据20条。select * from T_SEAT_MSG order by time desc limit 0,20;

sql进行Order by排序再进行分页limit取值会出现重复显示问题_第2张图片

再次取20-40条数据对比两个表的数据就会发现出现重复的数据了。select * from T_SEAT_MSG order by time desc limit 20,20;

sql进行Order by排序再进行分页limit取值会出现重复显示问题_第3张图片

我的解决方案进行SQL改写:先通过时间排序再通过客服Id排序,客服id是唯一字段。

select * from T_SEAT_MSG order by time desc,staffId asc limit 0,20;

原因:

数据库order by排序不唯一,的确会导致最终的数据排序是不是稳定的,表现出来的结果,就是分页时会重复显示; 

建议在 order by 最后,增加 PK 列或 ROWID;

单单是增加索引缺失不能解决问题,但是增加唯一性索引就行了,pk列或者rowid也能确保唯一,结论是只有能保证order by排序唯一,才会导致结果不重复

注意看这张表id返回的顺序完全不一样。

sql进行Order by排序再进行分页limit取值会出现重复显示问题_第4张图片

 

对于limit来说它是MySQL数据库顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。
其实简单的说就是,你去查数据库,limit就是MySQL根据返回数据的顺序给他的一个编号,谁先返回谁就是1,如果不存在order by排序条件那么它就是MySQL的存储顺序。     

错误导致原因分析:于是当本文中取出的数据的time这个字段的值是一样的时候,MySQL在返回数据时,返回数据顺序不是固定的,我们取前8个数据的时候,数据库返回数据的顺序,与我们取前15个数据时,数据库返回数据的顺序是完全不同的,于是他生成的limit伪列编号就完全不一样,就导致了这样的错误。

版权声明:本文为博主原创文章,转载请说明转载来源。https://blog.csdn.net/weixin_41092717/article/details/82351735

 

你可能感兴趣的:(MySQL)