当前位置:   article > 正文

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

sql 先排序 后limit

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

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

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

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

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

我的解决方案进行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返回的顺序完全不一样。

 

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/268640
推荐阅读
相关标签
  

闽ICP备14008679号