最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL子查詢中order by不生效問題的解決方法

 更新時間:2021年07月31日 10:49:39   作者:simpleapples  
ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進行排序,在日常工作中經(jīng)常會用到,這篇文章主要給大家介紹了關(guān)于MySQL子查詢中order by不生效問題的解決方法,需要的朋友可以參考下

一個偶然的機會,發(fā)現(xiàn)一條SQL語句在不同的MySQL實例上執(zhí)行得到了不同的結(jié)果。

問題描述

創(chuàng)建商品表product_tbl和商品操作記錄表product_operation_tbl兩個表,來模擬下業(yè)務(wù)場景,結(jié)構(gòu)和數(shù)據(jù)如下:

接下來需要查詢所有商品最新的修改時間,使用如下語句:

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;

通過結(jié)果可以看到,子查詢先將product_operation_log_tbl里的所有記錄按創(chuàng)建時間(created_at)逆序,然后和product_tbl進行join操作,進而查詢出的商品的最新修改時間。


在區(qū)域A的MySQL實例上,查詢商品最新修改時間可以得到正確結(jié)果,但是在區(qū)域B的MySQL實例上,得到的修改時間并不是最新的,而是最老的。通過對語句進行簡化,發(fā)現(xiàn)是子查詢中的order by created_at desc語句在區(qū)域B的實例上沒有生效。

排查過程

難道區(qū)域會影響MySQL的行為?經(jīng)過DBA排查,區(qū)域A的MySQL是5.6版,區(qū)域B的MySQL是5.7版,并且找到了這篇文章:

https://blog.csdn.net/weixin_42121058/article/details/113588551

根據(jù)文章的描述,MySQL 5.7版會忽略掉子查詢中的order by語句,可令人疑惑的是,我們模擬業(yè)務(wù)場景的MySQL是8.0版,并沒有出現(xiàn)這個問題。使用docker分別啟動MySQL 5.6、5.7、8.0三個實例,來重復(fù)上面的操作,結(jié)果如下:


可以看到,只有MySQL 5.7版忽略了子查詢中的order by。有沒有可能是5.7引入了bug,后續(xù)版本又修復(fù)了呢?

問題根因

繼續(xù)搜索文檔和資料,發(fā)現(xiàn)官方論壇中有這樣一段描述:

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標(biāo)準(zhǔn)中,table的定義是一個未排序的數(shù)據(jù)集合,而一個SQL子查詢是一個臨時的table,根據(jù)這個定義,子查詢中的order by會被忽略。同時,官方回復(fù)也給出了解決方案:將子查詢的order by移動到最外層的select語句中。

總結(jié)

在SQL標(biāo)準(zhǔn)中,子查詢中的order by是不生效的

MySQL 5.7由于在這個點上遵循了SQL標(biāo)準(zhǔn)導(dǎo)致問題暴露,而在MySQL 5.6/8.0中這種寫法依然是生效的

到此這篇關(guān)于MySQL子查詢中order by不生效問題的文章就介紹到這了,更多相關(guān)MySQL子查詢order by不生效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

參考文檔

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/

您可能感興趣的文章:

相關(guān)文章

  • mysql數(shù)據(jù)遷移之data目錄復(fù)制方法

    mysql數(shù)據(jù)遷移之data目錄復(fù)制方法

    這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)遷移之data目錄復(fù)制方法的相關(guān)資料,MySQL的data文件是存儲數(shù)據(jù)庫的核心文件,它包含了所有的表、索引、視圖和其它相關(guān)的數(shù)據(jù),通過復(fù)制這些文件,我們可以將一個MySQL數(shù)據(jù)庫遷移到另一個地方,需要的朋友可以參考下
    2023-08-08
  • Mac安裝 mysql 數(shù)據(jù)庫總結(jié)

    Mac安裝 mysql 數(shù)據(jù)庫總結(jié)

    本文給大家分享的是如何在Mac下安裝mysql數(shù)據(jù)庫的方法,總結(jié)的很全面,有需要的小伙伴可以參考下
    2016-04-04
  • Windows 下 MySQL 8.X 的安裝教程

    Windows 下 MySQL 8.X 的安裝教程

    這篇文章主要介紹了Windows 下 MySQL 8.X 的安裝教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • MySQL 鎖的相關(guān)知識總結(jié)

    MySQL 鎖的相關(guān)知識總結(jié)

    這篇文章主要介紹了MySQL 鎖的相關(guān)知識總結(jié),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • MySQL數(shù)據(jù)庫中的UPDATE(更新數(shù)據(jù))詳解

    MySQL數(shù)據(jù)庫中的UPDATE(更新數(shù)據(jù))詳解

    這篇文章主要詳細(xì)介紹了MySQL的UPDATE語句,包括其基本語法、高級用法、性能優(yōu)化策略以及注意事項,通過示例和實戰(zhàn),幫助讀者更好地理解和應(yīng)用這一重要的SQL命令,需要的朋友可以參考下
    2024-12-12
  • 使用MySQL的yum源安裝MySQL5.7數(shù)據(jù)庫的方法

    使用MySQL的yum源安裝MySQL5.7數(shù)據(jù)庫的方法

    這篇文章主要介紹了使用MySQL的yum源安裝MySQL5.7數(shù)據(jù)庫的方法的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • Mysql中@和@@符號的詳細(xì)使用指南

    Mysql中@和@@符號的詳細(xì)使用指南

    最近工作遇到了一個問題,給自己做個記錄,下面這篇文章主要給大家介紹了關(guān)于Mysql中@和@@符號的詳細(xì)使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • MySQL查詢性能優(yōu)化的7個常見查詢錯誤及解決方案

    MySQL查詢性能優(yōu)化的7個常見查詢錯誤及解決方案

    數(shù)據(jù)庫性能是Web應(yīng)用和大型軟件系統(tǒng)穩(wěn)定運行的關(guān)鍵,即使是精心設(shè)計的應(yīng)用,如果數(shù)據(jù)庫查詢效率低下,也會導(dǎo)致用戶體驗下降、系統(tǒng)資源浪費,甚至系統(tǒng)崩潰,本文將深入探討MySQL查詢優(yōu)化,分析常見的查詢錯誤,并提供提升數(shù)據(jù)庫性能的實用技巧,需要的朋友可以參考下
    2025-04-04
  • mysql 批量查詢?nèi)∶恳唤M最新一條數(shù)據(jù)

    mysql 批量查詢?nèi)∶恳唤M最新一條數(shù)據(jù)

    根據(jù)車牌號查詢最新的一條交車記錄的‘合同號’ ,這里只需要查詢‘合同號’這個字段,這篇文章主要介紹了mysql 批量查詢?nèi)∶恳唤M最新一條數(shù)據(jù),需要的朋友可以參考下
    2024-02-02
  • MySQL查詢條件常見用法詳解

    MySQL查詢條件常見用法詳解

    這篇文章主要介紹了MySQL查詢條件常見用法,結(jié)合實例形式總結(jié)分析了MySQL常見的各類查詢條件與簡單使用方法,需要的朋友可以參考下
    2019-11-11

最新評論

夏河县| 静乐县| 莱芜市| 吐鲁番市| 汤原县| 德保县| 黄冈市| 那坡县| 饶平县| 洛阳市| 阳谷县| 怀安县| 绥宁县| 阿克| 林州市| 象州县| 新疆| 衡水市| 霍山县| 东明县| 汝南县| 那坡县| 金寨县| 勃利县| 华安县| 绥江县| 上犹县| 五寨县| 仁怀市| 全南县| 岳普湖县| 江川县| 铁岭市| 深泽县| 神池县| 定南县| 凤凰县| 东乡| 平湖市| 焦作市| 泸溪县|