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 联合查询优化机制
May 10 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 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
基于initPHP的框架介绍
2013/04/18 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
详解python之协程gevent模块
2018/06/14 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python安装scipy的步骤解析
2019/09/28 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
白色公司:The White Company
2017/10/11 全球购物
单位实习证明怎么写
2014/01/17 职场文书
会计学毕业生求职信
2014/06/25 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
2015年教师工作总结范文
2015/03/31 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
教师理论学习心得体会
2016/01/21 职场文书
golang中的struct操作
2021/11/11 Golang
Python制作春联的示例代码
2022/01/22 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电