MySQL - 当LIMIT 进行分页时,为什么出现了重复数据_当排序字段为null的时候,使用limit offset查询,分页会查询到相同的某条数据-程序员宅基地

技术标签: MySQL排序  limit分页  MySQL  MySQL分页  数据重复  orderBy排序  

哦,这时写的一个破SQL,遗留了个问题,没有去注意,所以造成了,有重复数据。因为引用了 PageHelper 插件,期初还以为是 插件有问题。后来想想,毕竟整个框架都是用的这个插件,就算有问题早应该会出现了。所以,第一时间想到了SQL,的确,去了排序就没有问题。

说在前面

数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务需要对某一字段排序,那么当待排序字段值相同时,我们得到的查询结果会是什么呢

问题描述

数据分页时需要根据数据记录创建时间create_time字段倒序,即使用order by create_time desc,但是我们会发现,前端进行请求时获取的数据并不正确,分页中出现了一定的重复数据。

问题原因

期初还很好奇,总数没问题,总查询也没问题,为什么数据会重复了,然后会把部分数据给覆盖了。后来,通过查看SQL发现,是根据时间进行排序的,然而 这个时间 恰恰 好多数据都是 同一时间插入,或者 设置的 同一时间。

先后执行 总查询(也就是不分页),是没有重复。

再次执行分页查询,分两页查询就有了出路。(且,两次查询出来的数据和总查询数据不一样了)

后来 发现,当SQL中ORDER BY待排序字段值相同时,系统对数据的排序可能变得随机,即一会儿这条数据在前面,一会儿这条数据在后面了 ,所以当翻页的时候我们很容易便看到了重复的数据。

当然 数据重复,你是不知道哪个是真的?哪个是假的?的。意思就是,第一页你看到了123,第二页看到了,345。或许真正的排序是 123645。

举个例子

我们可以通过一组数据做个简单实验,以下为一组实验数据,member_id字段为数据主键,数据的create_time字段完全相同

我们执行以下SQL,将数据以create_time字段倒序查询,查询结果如下:

select member_id,create_time from member order by create_time desc;

查询结果:

 我们发现查询结果中,数据排序变成了一种无序状态,这也是导致我们分页查询时出现重复数据的问题原因
 我们执行以下SQL,将数据以create_time字段倒序后再根据主键排序查询,查询结果如下:

select member_id,create_time from member order by create_time desc,member_id;

我们发现数据恢复了有序的状态。这也为我们提供了避免数据分页时待排序字段值相同情况时结果无序的解决方案。

SQL中ORDER BY相同值结果乱序的具体原因

查阅了Goole和相关资料,大概总结了这种情况的原因。其实发生这种现象是“故意”设计的。

如果没有指定ORDER BY语句,则SQL Server(或任何RDBMS)不保证以特定顺序返回结果。 有些人认为,如果没有指定order by子句,行总是以聚簇索引顺序或物理磁盘顺序返回。 然而,这是不正确的,因为在查询处理期间可以改变行顺序的许多因素,例如并行的HASH连接是更改行顺序的操作符的一个很好的例子。

如果指定ORDER BY语句,SQL Server将对行进行排序,并按请求的顺序返回。 但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”

确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。

总结

为了避免类似的问题,我们可以将主键(或者具有唯一性的字段)排序引入需要排序的业务字段后。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Soinice/article/details/84729296

智能推荐

axios发送post请求,thinkphp获取不到参数_axios post thinkphp-程序员宅基地

文章浏览阅读1.9k次。我使用的是vue-cli可能是发送的数据格式不对,需要添加头信息(content-type)。引入qs插件,用qs转变数据格式。import qs from 'qs';axios.post('/api/xxx/xxx/xxx?'+qs.stringify(newChild), { headers:{ ..._axios post thinkphp

求解离散对数——BSGS算法の板子_离散对数求解概率算法-程序员宅基地

文章浏览阅读2.8k次。ATP发现坐在机房里最直接的代价就是用于零食的生活费和体重都直线上涨= =_离散对数求解概率算法

Element-UI+VUE 实现按钮权限管理_el-button权限控制-程序员宅基地

文章浏览阅读2.1w次,点赞38次,收藏153次。前端朋友遇到项目中的一个问题,就是需要根据后台接口返回的数据,来判断当前用户的操作权限。比如有删除权限,就显示对应的删除按钮,没有这个权限,就置为不可点击状态,或者就是直接隐藏。作为一个后台开发工作者来讲,对于前端的一个技术,涉猎并不是很深,只能通过官方文档或者百度先简单了解下。经过一系列的调查 得知,想实现这么一个功能,比较简单的就是使用VUE中的状态管理(有没有其他更好的方法,暂时还不知道..._el-button权限控制

键盘的介绍_键盘的简介csdn-程序员宅基地

文章浏览阅读206次。Ctrl键:控制键 通常与其它字母键组合使用,Ctrl + C复制/ Ctrl + V粘贴/ Ctrl + X剪切/ Ctrl + A全选/ Ctrl + S保存/ Ctrl + Z返回上一步/ Ctrl + N新建/ Ctrl + O打开等。按下此键为改写状态,输入的字符将会替换掉光标当前所在位置的字符。Delete键:1)删除鼠标光标当前位置右侧的一个字符,且光标右边的所有字符整体向左一定一个字符的位置。右单击输入法指示器,点设置,在弹出的对话框中,单击下拉列表,选择一种中文输入法,点确定。_键盘的简介csdn

YOLOV5---数据集格式转化及训练集和验证集划分_yolov5要求数据格式是什么-程序员宅基地

文章浏览阅读1.9w次,点赞19次,收藏167次。YOLOV5---数据集格式转化及训练集和验证集划分VOC标签格式转yolo格式并划分训练集和测试集标签为yolo格式数据集划分训练集和验证集VOC标签格式转yolo格式并划分训练集和测试集yolov5训练所需要的文件格式是txt格式的,基于labelimage标注的格式有VOC(xml格式),同时训练自己的yolov5检测模型的时候,数据集需要划分为训练集和验证集。本文基于python,实现了将xml格式的标签文件转换为txt文件,同时按比例划分为训练集和验证集的功能。import xml.etr_yolov5要求数据格式是什么

python爬虫之scrapy_192.168.30.00:8888-程序员宅基地

文章浏览阅读6k次,点赞5次,收藏21次。scrapy安装在windows下,在dos中运行pip install Scrapy报错采用pip安装,安装时可能会出现安装错误Microsoft Visual C++ 14.0 is required,解决方案http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(如我的Twisted‑1..._192.168.30.00:8888

随便推点

linux服务器网卡驱动安装,在linux下安装网卡驱动的方法-程序员宅基地

文章浏览阅读1.8k次。本文告诉你如何在linux系统下安装网卡驱动.把网卡驱动COPY 到软盘上.在linux 的/tmp下建个空目录,然后再把软盘上的驱动COPY到这个空目录下.解压缩:#tar zxvf r1000_v1.05.tgz (文件所在的目录)#make (是在r1000_v1.05目录)如果在此没有出现什么错误,输入MAKE之后有很多行信息,在/lib/modules/2.6.9-5.ELsmp/ker...

realmeQ3 Pro狂欢版和GT Neo闪速版有什么区别_realme gt neo闪速版开机后是黑白色如何恢复彩色-程序员宅基地

文章浏览阅读2.9w次。真我Q3 Pro主要提升了颜值以及自拍性能。realme真我Q3 Pro共配备了天空之城、黑巧森林两款时尚的配色,而且机身仅有174g的重量以及7.9mm厚度,手感更为舒适,依旧配备了4500mAh大容量电池,可能是同价位最轻薄的手机。选realmeQ3 Pro狂欢版还是GT Neo闪速版这些点很重要看过你就懂了http:// realme.adiannao.cn/7真我Q3 Pro狂欢版手机非常轻薄,但是在电池方面却没有妥协,依旧配备了4500mAh大容量电池,同时配备了50W智慧闪充,14分钟充至50_realme gt neo闪速版开机后是黑白色如何恢复彩色

Redis 6 redis-cluster-proxy 集群代理使用-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏7次。redis-cluster-proxy_redis-cluster-proxy

Vue项目中引用‘阿里巴巴字体图标库iconfont’_iconfont下载的代码与官网不一样-程序员宅基地

文章浏览阅读2.4k次,点赞48次,收藏92次。1.前言在实际开发中,作为前端开发人员的我们经常会遇到下面这种ui图我们看到在上面两个平台设计图中的出现了大量的图标,在某种情况下,这种图标是需要我们自己去找的,不要喷我们的 ui 哈,主要是我喜欢麻烦 哈哈,如果ui提供我也是要求他为我们提供SVG格式的,至于为什么 下面会为大家讲解。在这里呢我们遇到这种图标可能会想到我们运用的框架中的字体图标,像element-ui、iview-ui中都提供了icon图标上面的两个ui框架中都提供了很多图标我们至于要直接运用即可,但是在我们的开发需求中很多_iconfont下载的代码与官网不一样

python显示图片并让用户框选_matplotlib选择图像的框区域,然后放大-程序员宅基地

文章浏览阅读791次。使用opencv从网络摄像头获取帧,然后进行绘图。我在图的中心画一个矩形,然后得到选定的区域并显示在另一个绘图中(通过插值放大)import matplotlib.pyplot as pltimport matplotlib.animation as animationimport cv2boxSize = 150enlargeBy = 3def getBoxCoordinates(cap, si..._py打开图片动态框选

2023年第四届MathorCup高校数学建模挑战赛——大数据竞赛B题解题思路_2023mathorcuo大数据初赛b题思路-程序员宅基地

文章浏览阅读2.5k次。还有一部分为数据编码处理,即对于商家编码为例,我们需要对这些变为数据进行后续处理,这里就需要大家设置数据标码方式,通常默认的方式,就是依次进行标码,如下所示。但是,这种逻辑异常的难点在于无法直接看出具体是,需要大家仔细查找,或者设置find函数的约束,进行查找,较为复杂。引入,大型促销下的商家+仓库+商品维度相关数据,与问题二思路相似,根据引入的数据利用分类模型,得出新的分类结果。利用问题一建立的分类模型,引入问题二附件五的数据进行重新分类判定,采用尽量采用问题一相同的预测模型,进行预测即可。_2023mathorcuo大数据初赛b题思路

推荐文章

热门文章

相关标签