mysql limit 数据重复及遗漏
某天写了一段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 数据重复及遗漏的更多相关文章
- mysql 删除数据重复的记录
delete from user where id not in ( select * from ( select min(id) from user group by username,email ...
- 为什么MYSQL分页时使用limit+ order by会出现数据重复问题
问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据, 示例sql如下: select a,b from c where d = ' ...
- mysql orderby limit 翻页数据重复的问题
在mysql中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页.但是,当limit遇到order by的时候,可能会 ...
- 解决 MySQL 分页数据错乱重复
前言 一天,小明兴匆匆的在通讯工具上说:这边线上出现了个奇怪的问题,麻烦 DBA 大大鉴定下,执行语句 select xx from table_name wheere xxx order by 字段 ...
- MySQL 分页数据错乱重复
select xx from table_name wheere xxx order by 字段A limit offset;, 表数据总共 48 条,分页数量正常,但出现了结果混杂的情况,第一页的数 ...
- mysql插入数据与删除重复记录的几个例子(收藏)
mysql插入数据与删除重复记录的几个例子 12-26shell脚本实现mysql数据的批量插入 12-26mysql循环语句插入数据的例子 12-26mysql批量插入数据(insert into ...
- 大数据量时 Mysql LIMIT如何正确对其进行优化(转载)
以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...
- MySQL删除数据表中重复数据
今天遇到一个问题,数据表的数据有重复的,关键原因在于新增数据时,没有根据条件先判断数据是否存在,当数据存在时进行有关条件的更新,不存在时做新增数据. 对于表中已经存在的数据处理办法的方法: 1.先根据 ...
- mysql找出重复数据的方法
mysql找出重复数据的方法<pre>select openid,count(openid) from info group by openid,jichushezhi_id HAVING ...
随机推荐
- Java中实现线程同步的三种方法
实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...
- 08.@Scheduled定时任务、整合jdbcTemplate、mybatis区分多数据源
@Scheduled注解执行定时任务 import org.springframework.scheduling.annotation.Scheduled; import org.springfram ...
- python tkinter开始
tkinter是python自带的GUI库,所以用起来会比较简单 运行一个什么都没有的窗口 import tkinter window=tkinter.Tk()#窗口类定义 window.mainlo ...
- GET和POST是HTTP请求的两种基本方法,区别是什么!?
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- tuple unpacking
拆开Tuple lax_coordinates = (33.9425, -118.408056) latitude, longitude = lax_coordinates # tuple unpac ...
- C#基础提升系列——C# LINQ
C# LINQ LINQ(Language Integrated Query,语言集成查询).在C# 语言中集成了查询语法,可以用相同的语法访问不同的数据源. 命名空间System.Linq下的类En ...
- 【leetcode】820. Short Encoding of Words
题目如下: 解题思路:本题考查就是找出一个单词是不是另外一个单词的后缀,如果是的话,就可以Short Encode.所以,我们可以把words中每个单词倒置后排序,然后遍历数组,每个元素只要和其后面相 ...
- python环境变量
下载并升级更新pip python -m pip install -U pip 变量名:PY_HOME 变量值:python路径 path:win10加在最后(记得用;号隔开):win7加在前面记 ...
- 4412 SPI驱动
1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...
- CSU 1503: 点到圆弧的距离(计算几何)
题目描述 输入一个点 P 和一条圆弧(圆周的一部分),你的任务是计算 P 到圆弧的最短距离.换句话 说,你需要在圆弧上找一个点,到 P点的距离最小. 提示:请尽量使用精确算法.相比之下,近似算法更难通 ...