欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

問題描述

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

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

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)建時(shí)間(created_at)逆序,然后和product_tbl進(jìn)行join操作,進(jìn)而查詢出的商品的最新修改時(shí)間。


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

排查過程

難道區(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三個實(shí)例,來重復(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子查詢是一個臨時(shí)的table,根據(jù)這個定義,子查詢中的order by會被忽略。同時(shí),官方回復(fù)也給出了解決方案:將子查詢的order by移動到最外層的select語句中。

總結(jié)

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

MySQL 5.7由于在這個點(diǎn)上遵循了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分區(qū)表的局限和限制詳解

    MySQL分區(qū)表的局限和限制詳解

    本文對Mysql分區(qū)表的局限性做了一些總結(jié),因?yàn)閭€人能力以及測試環(huán)境的 原因,有可能有錯誤的地方,還請大家看到能及時(shí)指出,當(dāng)然有興趣的朋友可以去官方網(wǎng)站查閱。
    2017-03-03
  • MySQL與PHP的基礎(chǔ)與應(yīng)用專題之索引

    MySQL與PHP的基礎(chǔ)與應(yīng)用專題之索引

    MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL?AB?公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL?是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎(chǔ)應(yīng)用,本篇從索引開始
    2022-02-02
  • MySQL優(yōu)化全攻略-相關(guān)數(shù)據(jù)庫命令

    MySQL優(yōu)化全攻略-相關(guān)數(shù)據(jù)庫命令

    MySQL優(yōu)化全攻略-相關(guān)數(shù)據(jù)庫命令...
    2006-11-11
  • MySQL-MMM安裝指南(Multi-Master Replication Manager for MySQL)

    MySQL-MMM安裝指南(Multi-Master Replication Manager for MySQL)

    這篇文章主要介紹了mysql Multi-Master Replication Manager for MySQL的安裝方法,需要的朋友可以參考下
    2014-02-02
  • MySQL 5.6 中 TIMESTAMP 的變化分析

    MySQL 5.6 中 TIMESTAMP 的變化分析

    這篇文章主要介紹了MySQL 5.6 中 TIMESTAMP 的變化分析,需要的朋友可以參考下
    2015-08-08
  • MySQL連接查詢你真的學(xué)會了嗎?

    MySQL連接查詢你真的學(xué)會了嗎?

    日常使用數(shù)據(jù)庫查詢語句時(shí),單表查詢嘗嘗不能滿足項(xiàng)目的業(yè)務(wù)需求,在項(xiàng)目開發(fā)過程中,有很多需求都是要涉及到多表的連接查詢,這篇文章主要給大家介紹了關(guān)于MySQL連接查詢的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • MySQL修改root賬號密碼的方法

    MySQL修改root賬號密碼的方法

    這篇文章介紹了兩種情況,知道root密碼的情況下修改root密碼,以及忘記了root密碼,如何對root的密碼進(jìn)行修改,需要的朋友可以參考下
    2015-07-07
  • MySQL優(yōu)化之InnoDB優(yōu)化

    MySQL優(yōu)化之InnoDB優(yōu)化

    InnoDB是為Mysql處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)。它的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的。在數(shù)據(jù)量大的網(wǎng)站或是應(yīng)用中Innodb是倍受青睞的。那么它就不需要優(yōu)化了嗎,答案很顯然:當(dāng)然不是?。?!
    2017-03-03
  • MySQL字符編碼設(shè)置方法

    MySQL字符編碼設(shè)置方法

    這篇文章主要介紹了MySQL字符編碼設(shè)置方法的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • mysql?8.0.27?安裝配置方法圖文教程(Windows64位)

    mysql?8.0.27?安裝配置方法圖文教程(Windows64位)

    這篇文章主要為大家詳細(xì)介紹了mysql?8.0.27?下載、安裝與配置圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論