MySQL子查询中order by不生效问题的解决方法


Posted in MySQL onAugust 02, 2021

一个偶然的机会,发现一条SQL语句在不同的MySQL实例上执行得到了不同的结果。

问题描述

创建商品表product_tbl和商品操作记录表product_operation_tbl两个表,来模拟下业务场景,结构和数据如下:

MySQL子查询中order by不生效问题的解决方法

MySQL子查询中order by不生效问题的解决方法

接下来需要查询所有商品最新的修改时间,使用如下语句:

select t1.id, t1.name, t2.product_id, t2.created_at  from product_tbl t1 left join (select * from product_operation_log_tbl order by created_at desc) t2 on t1.id = t2.product_id group by t1.id;

通过结果可以看到,子查询先将product_operation_log_tbl里的所有记录按创建时间(created_at)逆序,然后和product_tbl进行join操作,进而查询出的商品的最新修改时间。

MySQL子查询中order by不生效问题的解决方法

在区域A的MySQL实例上,查询商品最新修改时间可以得到正确结果,但是在区域B的MySQL实例上,得到的修改时间并不是最新的,而是最老的。通过对语句进行简化,发现是子查询中的order by created_at desc语句在区域B的实例上没有生效。

排查过程

难道区域会影响MySQL的行为?经过DBA排查,区域A的MySQL是5.6版,区域B的MySQL是5.7版,并且找到了这篇文章:

https://blog.csdn.net/weixin_42121058/article/details/113588551

根据文章的描述,MySQL 5.7版会忽略掉子查询中的order by语句,可令人疑惑的是,我们模拟业务场景的MySQL是8.0版,并没有出现这个问题。使用docker分别启动MySQL 5.6、5.7、8.0三个实例,来重复上面的操作,结果如下:

MySQL子查询中order by不生效问题的解决方法

可以看到,只有MySQL 5.7版忽略了子查询中的order by。有没有可能是5.7引入了bug,后续版本又修复了呢?

问题根因

继续搜索文档和资料,发现官方论坛中有这样一段描述:

A "table" (and subquery in the FROM clause too) is - according to the SQL standard - an unordered set of rows. Rows in a table (or in a subquery in the FROM clause) do not come in any specific order. That's why the optimizer can ignore the ORDER BY clause that you have specified. In fact, SQL standard does not even allow the ORDER BY clause to appear in this subquery (we allow it, because ORDER BY ... LIMIT ... changes the result, the set of rows, not only their order). You need to treat the subquery in the FROM clause, as a set of rows in some unspecified and undefined order, and put the ORDER BY on the top-level SELECT.

问题的原因清晰了,原来SQL标准中,table的定义是一个未排序的数据集合,而一个SQL子查询是一个临时的table,根据这个定义,子查询中的order by会被忽略。同时,官方回复也给出了解决方案:将子查询的order by移动到最外层的select语句中。

总结

在SQL标准中,子查询中的order by是不生效的

MySQL 5.7由于在这个点上遵循了SQL标准导致问题暴露,而在MySQL 5.6/8.0中这种写法依然是生效的

到此这篇关于MySQL子查询中order by不生效问题的文章就介绍到这了,更多相关MySQL子查询order by不生效内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

参考文档

https://stackoverflow.com/questions/26372511/mysql-mariadb-order-by-inside-subquery

https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/

 

MySQL 相关文章推荐
mysql部分操作
Apr 05 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL系列之五 视图、存储函数、存储过程、触发器
Jul 02 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
pt-archiver 主键自增
Apr 26 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 #MySQL
MySql子查询IN的执行和优化的实现
MySQL里面的子查询的基本使用
Aug 02 #MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 #MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
使用ORM新增数据在Mysql中的操作步骤
Jul 26 #MySQL
mysql脏页是什么
Jul 26 #MySQL
You might like
PHP 中的一些经验积累
2006/10/09 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
php银联网页支付实现方法
2015/03/04 PHP
Opacity.js
2007/01/22 Javascript
JS模拟多线程
2007/02/07 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python生成器generator用法示例
2018/08/10 Python
浅述python中深浅拷贝原理
2018/09/18 Python
django框架使用方法详解
2019/07/18 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
教师见习总结范文
2015/06/23 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server