转自 http://blog.csdn.net/wwwwei_csdn/article/details/78181197

前言

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

问题描述

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

问题原因

  由于大量数据是并发创建的,所以create_time字段值是相同的。这里会有一个很有趣的问题,当order by的字段相同的时候 系统对数据的排序可能变得随机,即一会儿这条数据在前面,一会儿这条数据在后面了 ,所以当翻页的时候我们很容易便看到了重复的数据。

做个实验

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

实验数据

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

select member_id,create_time from member order by create_time desc;
  • 1
  • 2

查询结果

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

select member_id,create_time from member order by create_time desc,member_id;
  • 1
  • 2

查询结果

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

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

  查阅了Goole和相关资料,大概总结了这种情况的原因。其实发生这种现象是“故意”设计的。
  如果没有指定ORDER BY语句,则SQL Server(或任何RDBMS)不保证以特定顺序返回结果。 有些人认为,如果没有指定order by子句,行总是以聚簇索引顺序或物理磁盘顺序返回。 然而,这是不正确的,因为在查询处理期间可以改变行顺序的许多因素,例如并行的HASH连接是更改行顺序的操作符的一个很好的例子。
  如果指定ORDER BY语句,SQL Server将对行进行排序,并按请求的顺序返回。 但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”
  确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。

总结

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

order by 导出数据不一致的问题的更多相关文章

  1. 【FAQ】分析服务导出的事件数据和概览页面展示的数据不一致该如何解决?

    华为分析服务面向开发者提供两种数据展现方式:(1)事件数据下载,开发者可以将事件数据下载后导入到自有的分析系统中:(2)直接在AGC概览页面查看用户数和事件数. 问题描述 某开发者想将事件数据导入到自 ...

  2. sql server 2005导出数据到oracle

    一. 在sql server下处理需要导出的数据库 1. 执行以下sql,查出所有'float'类型的字段名,手动将float类型改为decimal(18,4). select 表名=d.name,字 ...

  3. 利用mysqldump 将一个表按条件导出数据

    mysqldump -uroot -pdsideal -t dsideal_db t_resource_info --where="res_type=1 and group_id=1 and ...

  4. MSSQL导入导出数据

    /******* 导出到excel */ EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S&qu ...

  5. java从mysql导出数据例子

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  6. 利用fputcsv导出数据备份数据

    今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...

  7. MySQL中mysqldump导出数据的使用

    mysqldump常用参数说明: 帮助使用:mysqldump --help -A, --all-databases 导出全部数据库 mysqldump -uroot -p –A > /tmp/ ...

  8. 从数据库导出数据到excel之List<List<Object>>导出

    说明:有时候数据处理为List<List<Object>>更方便 姊妹篇:从数据库导出数据到excel之List<Map<>>导出 兄弟篇:从数据库导出 ...

  9. phpexcel如何读取excel的数据和如何导出数据到excel

    phpexcel如何读取excel的数据和如何导出数据到excel 一.总结 一句话总结:去官网看参考手册和api,或者找中文的博客或者参考手册 1.phpexcel插件如何下载? 其实这些插件不仅可 ...

随机推荐

  1. 题解-AtCoder Code-Festival2017qualA-E Modern Painting

    Problem CODE-FESTIVAL 2017 qual A 洛谷账户的提交通道 题意:有一个\(n\)行\(m\)列的方格,在边界外有可能有机器人(坐标为\((0,x),(n+1,x),(x, ...

  2. Media Query-响应式布局

    做响应式网站的时候,一定要在页面头部加入如下的声明: <meta name="viewport" content="width=device-width, init ...

  3. corba/ice/web service/com+

    //todo model1 model2

  4. 前端 ---jQuery的补充

    15-jQuery补充   jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryu ...

  5. 用puttygen工具把私钥id_rsa转换成公钥id_rsa.ppk

    1 前言 有时候需要ppk格式的公钥,可以用putty来处理 2 步骤 1. 产生密钥 可以参考Gitlab的SSH配置(linux和windows双版本) $ ssh-keygen -t rsa - ...

  6. [MySQL]group by 与 if 的统计技巧

    group by查询旨在把某字段中相同的记录合并成一列,查询结果可受count(),sum()等统计函数影响 如下表 id totalclick validclick 1 3 1 2 3 1 3 5 ...

  7. Oracle12c Data Guard搭建手册

    Oracle12c Data Guard搭建手册 注:本文来源: 红黑联盟 < Oracle12c Data Guard搭建手册 > Oracle 12c 的DataGuard 是在CDB ...

  8. SecureCRT中sqlplus,使用Backspace删除时 ^H^H

    平时习惯用Backspace删除输入错误,但是在SecureCRT中使用是,却是: SQL> sele^H^H 网上有几个方法,觉得改SecureCRT的配置最方便.

  9. jQuery获取地址栏中的链接参数

    http://caibaojian.com/177.html 问题描述 今天做一个主题,有一个需求是根据不同的页面来做,虽然php也可以做到,不过考虑到自己的特效代码都是在jQuery上完成,想着能否 ...

  10. nodejs之koa-router与koa-body搭配使用

    简介 koa需要搭配中间件来做接口更方便,使用Koa-body & Koa-router 使用 koa2 创建接口,处理post请求 const koa=require("koa&q ...