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 常见的数据表设计误区汇总
Jun 07 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
MySQL数据库 安全管理
May 06 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL分布式恢复进阶
Jul 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
python学习笔记:字典的使用示例详解
2014/06/13 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python Grid使用和布局详解
2018/06/30 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
Python实现最大子序和的方法示例
2019/07/05 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
利用python绘制正态分布曲线
2021/01/04 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
教研处工作方案
2014/05/26 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers