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 28 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
MySQL开启事务的方式
Jun 26 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
javascript History对象原理解析
2020/02/17 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
详解Python用户登录接口的方法
2019/04/17 Python
详解Python传入参数的几种方法
2019/05/16 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python 处理文件的几种方式
2019/08/23 Python
python可迭代对象去重实例
2020/05/15 Python
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
软件测试面试题
2015/10/21 面试题
2013的个人自我评价
2013/12/26 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
安全生产先进个人材料
2014/02/06 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
学校教代会开幕词
2016/03/04 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
Python机器学习之决策树和随机森林
2021/07/15 Javascript
python内置模块之上下文管理contextlib
2022/06/14 Python