MySQL order by limit 分页数据重复问题 并 丢失其他数据

使用 order by 与limit 同时使用 数据出现重复 并丢失其他数据

使用了 下面的 方法  发现也没什么问题 

Db::name('users')
->where(['is_disabled'=>0])
->field('id,nickname,team_son+team_grandson as sort,team_son,team_grandson')
->order('sort desc')
->page($page, 20)
->select();

 打印sql 语句 去运行  发现 第i 页 的数据 与 第 i+1 页 的 数据出现重复 并且 丢失了一些数据

SELECT `id`,`nickname`,team_son+team_grandson as sort,`team_son`,`team_grandson` FROM `table_name` WHERE
`is_disabled` = 0 ORDER BY `sort` DESC LIMIT 200,20

经过学习 发现  在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。

若再想 使用 order by 加 limit的 形式 

1、 就只能 使用 索引 进行排序

2、像我这样的情况 不能使用 索引字段的话 只能进行 双排序

也就是   ORDER BY `sort` DESC,`id` 把索引字段作为 附加条件 进行排序 就可以了 

SELECT `id`,`nickname`,team_son+team_grandson as sort,`team_son`,`team_grandson` FROM `users` WHERE
`is_disabled` = 0 ORDER BY `sort` DESC,`id` ASC LIMIT 200,20

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值