• 售前

  • 售后

热门帖子
入门百科

MySQL子查询中order by不生效题目标解决方法

[复制链接]
Jacqueline季 显示全部楼层 发表于 2021-8-14 14:13:17 |阅读模式 打印 上一主题 下一主题
一个偶然的机会,发现一条SQL语句在差别的MySQL实例上实行得到了差别的结果。
题目形貌


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


接下来需要查询所有商品最新的修改时间,利用如下语句:
  1. 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操纵,进而查询出的商品的最新修改时间。


在区域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 5.7版忽略了子查询中的order by。有没有可能是5.7引入了bug,后续版本又修复了呢?
题目根因


继续搜刮文档和资料,发现官方论坛中有这样一段形貌:
  1. 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/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作