某天写了一段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 '' COMMENT '供应商ID',
`poi_id` int(11) unsigned NOT NULL DEFAULT '' COMMENT '门店ID',
`product_id` bigint(20) unsigned NOT NULL DEFAULT '' 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关闭了,不然真的要改行了。

mysql limit 数据重复及遗漏的更多相关文章

  1. mysql 删除数据重复的记录

    delete from user where id not in ( select * from ( select min(id) from user group by username,email ...

  2. 为什么MYSQL分页时使用limit+ order by会出现数据重复问题

    问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据,  示例sql如下: select  a,b from c where d = ' ...

  3. mysql orderby limit 翻页数据重复的问题

    在mysql中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页.但是,当limit遇到order by的时候,可能会 ...

  4. 解决 MySQL 分页数据错乱重复

    前言 一天,小明兴匆匆的在通讯工具上说:这边线上出现了个奇怪的问题,麻烦 DBA 大大鉴定下,执行语句 select xx from table_name wheere xxx order by 字段 ...

  5. MySQL 分页数据错乱重复

    select xx from table_name wheere xxx order by 字段A limit offset;, 表数据总共 48 条,分页数量正常,但出现了结果混杂的情况,第一页的数 ...

  6. mysql插入数据与删除重复记录的几个例子(收藏)

    mysql插入数据与删除重复记录的几个例子 12-26shell脚本实现mysql数据的批量插入 12-26mysql循环语句插入数据的例子 12-26mysql批量插入数据(insert into ...

  7. 大数据量时 Mysql LIMIT如何正确对其进行优化(转载)

    以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...

  8. MySQL删除数据表中重复数据

    今天遇到一个问题,数据表的数据有重复的,关键原因在于新增数据时,没有根据条件先判断数据是否存在,当数据存在时进行有关条件的更新,不存在时做新增数据. 对于表中已经存在的数据处理办法的方法: 1.先根据 ...

  9. mysql找出重复数据的方法

    mysql找出重复数据的方法<pre>select openid,count(openid) from info group by openid,jichushezhi_id HAVING ...

随机推荐

  1. ubuntu安装Scala

    参考地址:https://blog.csdn.net/qq_36743482/article/details/78317549 1.下载Scala:http://www.scala-lang.org/ ...

  2. ivew 双向绑定时间控件

    <FormItem label="开始时间" style="width: 100%" prop="startDate"> < ...

  3. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

  4. 人生苦短_我用Python_logging日志操作_011

    话不多说,开搞,基础是先使用自带loggin模块,level为warning以上, 进一步是自定义logger,level可自定义 #!/usr/bin/env python # -*- coding ...

  5. 浅谈SAP CRM和Hybris Commerce里的价格架构折扣

    最近Jerry做了一个和价格折扣相关的原型项目,把学到的知识记录下来,以备将来查阅. 在这个原型项目里,我们用React-Native开发了一个移动应用,用户可以在手机上浏览SAP Hybris Co ...

  6. 测试md代码折叠功能

    展开查看 System.out.println("Hello to see U!");

  7. controllerpom

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  8. Python基础教程(013)--一行代码不要做多件事情

    前言 学习代码编写风格 内容 语法错误报错的信息 SystaxErrot:invalid syntax 语法错误, invalid 无效 每行代码负责完成一个动作 阅读代码,从左至右,从上到下. 学习 ...

  9. AcWing 244. 谜一样的牛 (树状数组+二分)打卡

    题目:https://www.acwing.com/problem/content/245/ 题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛 ...

  10. css > 的写法 html

    .userInfo-view .info .name::after { content: " "; display: inline-block; height: 12rpx; wi ...