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中 unique列插入重复值该怎么解决呢
May 26 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 MySQL
MySQL 原理与优化之Update 优化
Aug 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
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
javascript date格式化示例
2013/09/25 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
Python画图学习入门教程
2016/07/01 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
开业庆典邀请函
2014/01/08 职场文书
2014年团支书工作总结
2014/11/14 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
使用scrapy实现增量式爬取方式
2022/06/21 Python