文档章节

mysql limit 数据重复及遗漏

o
 osc_mervd488
发布于 2018/04/23 18:53
字数 674
阅读 0
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

某天写了一段CRUD,提测给QA,后来想起来忘记按规则排序了,然后修改了代码提交,这个时候QA扔给我一条狗,不,是一个BUG。

内心一片忧伤,CRUD也有BUG啊,怎么办怎么办,赶紧看看去。

BUG描述:分页查询出来的数据有重复和遗漏。这个地方用一个测试表来描述吧。

CREATE TABLE `product_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `partner_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '供应商ID',
  `poi_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '门店ID',
  `product_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID',
  `quantity` decimal(18,6) NOT NULL DEFAULT '0.000000' COMMENT '数量',
  `created_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '创建时间',
  `modify_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_partner_poi_product` (`partner_id`,`poi_id`,`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='商品表'

数据表product_info中共有8条数据。

分页查询第一页:

 

分页查询第二页:

 

 

结论:从图上我们可以看到 id in(10,40)的数据出现了2次,id in(7,8)的数据没有被查出来。数据确实出现了重复和遗漏。我之前对于mybatis的理解是它会默认按照ID进行排序的,产生了怀疑。

第一页看起来是排序是乱的,其实并不是,这个顺序是我写入数据的顺序(10,2,3,40,5,63,7,8 故意把ID弄乱了)。第二页看起来是按照id进行排序的。

也就是说两次查询感觉用了不一样的排序方式?其实不是的。真是情况是,它用了堆排序。

那么不是默认按照ID排序的吗?其实在非limit的情况下,默认真的是按照ID排序的。不信,你看!

 

那么面对这种情况要怎么解决分页查询的遗漏和重复呢?--增加排序字段

 

可是你看,加了排序字段后还是漏了一条 id in (3)的数据。这又是为什么呢?

我们先看看这几个数据有什么问题呢,可以看到这个排序字段对应的值都是一样的。我怀疑它排序的时候,相同值的排列方式也是堆排序,没有求证,哪位知道的小哥哥小姐姐求指正。

所以第二页limit的时候这几天记录排序不一样,但是从第6条开始取值,就漏掉了3,重复了10。

 

那么这到底要怎么办?--还是那句话增加排序字段!

增加一个ID字段进行排序,这样就可以把BUG关闭了,不然真的要改行了。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如何通过日期属性对数组进行排序 - How to sort an array by a date property

问题: Say I have an array of a few objects: 说我有一些对象的数组: var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; How can I sort......

javail
36分钟前
22
0
技术教程| 百度鹰眼历史轨迹查询:轨迹抽稀功能

本文作者:用****9 本篇教程中,我们将详细地说明鹰眼历史轨迹查询(gettrack接口)中,如何通过vacuate_grade选项对轨迹进行抽稀,以及不同的抽稀力度对轨迹产生的影响。 上一篇教程中,我们...

百度开发者中心
前天
17
0
整数的最大值和最小值 - Maximum and Minimum values for ints

问题: I am looking for minimum and maximum values for integers in python. 我在python中寻找整数的最小值和最大值。 For eg., in Java, we have Integer.MIN_VALUE and Integer.MAX_VA......

法国红酒甜
今天
22
0
Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
今天
4
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部