MySQL中order by 与 limit 同时用的数据重复问题

在写接口分页时遇到了一个 order by 与 limit 同时用的时候出现的问题  当分页查询出的数据会有重复的,差了好多资料,都将矛头指向了MySQL

资料:

如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。

基于这个我们就基本知道为什么分页会不准了,因为我们排序的字段是“is_top”,正好又有几个相同的值的行,在实际执行时返回结果对应的行的顺序是不确定的。对应上面的情况,第一页返回的name为8的数据行,可能正好排在前面,而第四页查询时name为8的数据行正好排在后面,所以第四页又出现了。

造成原因:

因为数据库同一字段的值是有多条数据相同的,“order by 字段名” 再加上 “limit” 就会出现问题了

解决办法:

找一个唯一的字段加在 order by 中

如果想在Limit存在或不存在的情况下,都保证排序结果相同,可以额外加一个排序条件。例如id字段是唯一的,可以考虑在排序字段中额外加个id排序去确保顺序稳定。

所以上面的情况下可以在SQL再添加个排序字段,比如id字段,这样分页的问题就解决了。修改后的SQL可以像下面这样:

SELECT * FROM user ORDER BY is_top,id LIMIT 6,2;

推荐阅读 更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure 阅读 3,504 评论 0 11
  • 在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似...
    丘八老爷 阅读 24,641 评论 6 20
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017 阅读 132,488 评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_ 阅读 30,855 评论 18 399
  • 说实话,我是个很守旧的人。社会发展到现在,我对很多新生事物多采取观望谨慎的态度。很多朋友,包括亲戚都埋怨我,太落伍...
    微言微评 阅读 323 评论 0 0