好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL子查詢中order by不生效問題的解決方法

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

熱門標簽:智能外呼系統復位 臨清電話機器人 拉卡拉外呼系統 大眾點評星級酒店地圖標注 高清地圖標注道路 話務外呼系統怎么樣 400電話可以辦理嗎 云南電商智能外呼系統價格 外東北地圖標注

一個偶然的機會,發現一條SQL語句在不同的MySQL實例上執行得到了不同的結果。

問題描述

創建商品表product_tbl和商品操作記錄表product_operation_tbl兩個表,來模擬下業務場景,結構和數據如下:

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

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,后續版本又修復了呢?

問題根因

繼續搜索文檔和資料,發現官方論壇中有這樣一段描述:

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中IN子查詢會導致無法使用索引問題
  • 詳細講述MySQL中的子查詢操作
  • 詳解MySQL子查詢(嵌套查詢)、聯結表、組合查詢
  • mysql in語句子查詢效率慢的優化技巧示例
  • MySQL優化之使用連接(join)代替子查詢
  • Mysql子查詢IN中使用LIMIT應用示例
  • MYSQL子查詢和嵌套查詢優化實例解析
  • mysql實現多表關聯統計(子查詢統計)示例
  • MySQL筆記之子查詢使用介紹

標簽:山西 三明 無錫 福州 定西 阿里 溫州 揚州

巨人網絡通訊聲明:本文標題《MySQL子查詢中order by不生效問題的解決方法》,本文關鍵詞  MySQL,子,查詢,中,order,不,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL子查詢中order by不生效問題的解決方法》相關的同類信息!
  • 本頁收集關于MySQL子查詢中order by不生效問題的解決方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 口述他用舌头让我高潮全过程| 综漫女主肉肉hhh文| 车速快多肉的动漫推荐| 好吊妞AV视频在线观看| 女人?精XXXXX亚| 91色综合综合热五月激情| 极品美麻麻怀孕| 运动员的大J篮球运动员吊大吗| 小sao货cao得你舒服吗男男| 亚洲天堂男| 成年片费网站色app免费观看| 国产理论在线观看| bt磁力天堂-最佳磁力搜索引擎| 中文字字幕在线中文乱码红治院 | 久久久国产精品无码一区二区三区| 少妇一晚三次一区二区三区| 精精国产xxx在线视频app| 一女n男做不停高h| 天堂色在线| 国产精品99久久免费观看外围| 男人桶女人下面gif动态图| 埋进腿间舌头使劲添公交车上视频| 黄色网页入口| 久久久熟妇熟女ⅩXXX| 3—12呦??女视频| 男日男视频| jk制服蕾丝超短裙流白浆| 操到哭| 午夜精品久久久久久久久久蜜桃 | 村长与寡妇互添| 男人边吃奶边爱边做视频日韩| 啪啪流水呻吟黄网站免费观看| 情侣肉H文| 丝袜诱惑一区二区| 《情欲电车》3在线观看| 国产精品96久久久久久| 女女同免费播放毛片| 汪清县| 久久乐最新免费观看地址| 日韩和的一区二区区别是什么知乎| 侵犯昭和寡妇五十路H1|