mysql order by limit 一起使用的坑,解决方案。order by和limit的混用产生的bug

本文探讨了在MySQL 5.7环境下,使用orderby和limit组合时遇到的排序问题,原因在于当排序字段有重复值时可能导致随机排序。解决方案包括升级到Mysql 8.0以上版本或加入额外唯一排序字段。
摘要由CSDN通过智能技术生成

mysql order by limit 一起使用的坑,解决方案。order by和limit的混用产生的bug

问题产生环境说明

服务器Mysql版本:5.7
前端需要对某个表的内容根据某一个字段的值进行分页排序显示。
先排序使用到了 order by ,后分页取一页的数据使用到了 limt。

问题的出现

当前端进行显示时,出现部分排序错误,甚至是重复数据将原本正常的数据覆盖的情况。这里服务器已经调整好了就不放错误对比图了。

问题产生的原因

我认为本质上是mysql设计上的问题,根据msql官方文档对order by 和 limit的说明:如果order by的列有相同的值时, mysql会随机选取这些行,具体根据执行计划有所不同;limit 获取指定行区间的数据。

当我们先用order by再使用limit时,因为分页显示是每一页都要再次获取,如果用以排序的字段有多个相同值,根据order by的机制,就会造成这些字段相同行的排序错误甚至是重复排序。

问题解决

知道了产生bug的原因,就是问题的解决了。为了满足当前的需求,给大家提供两种解决方案:

  1. 升级Mysql版本,我在本地使用8.0+的版本就不会有这个问题。
  2. 增加第二排序字段,如select id,sno,score from student order by score desc,id asc limit a,b 。增加的排序字段最好是主键或者唯一值的字段,这样不会重复就没有问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值