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

MySQL中order by在子查詢中失效的問題解決方案

 更新時間:2023年07月22日 11:28:43   作者:SYKMI  
這篇文章主要介紹了MySQL中order by在子查詢中失效的問題解決,文中補充介紹了Mysql 5.7版本導致的子查詢order by排序無效問題的探究,需要的朋友可以參考下

MySQL中order by在子查詢中失效的問題

我們的項目MySQL版本是5.7,之前有一張圖書表,里面有三個關(guān)鍵字段type(圖書類型)和book_name(圖書名稱)和visits_num(瀏覽量)字段,遇到一個需求需要分別查詢出電子書和紙質(zhì)書瀏覽量最高的書籍,我心想不是很簡單嗎,只需要先將圖書表按瀏覽量倒序然后再分組(分組會保留第一條記錄)即可,于是三下五除二就寫出了sql

select type, book_name
from (select * from book order by visits_num desc) t1
group by type

結(jié)果一運行發(fā)現(xiàn)和預想的結(jié)果集不一樣,研究才發(fā)現(xiàn)原來在5.7版本中會忽略掉子查詢中的order by語句,也就是排序被優(yōu)化掉了,可以通過在子查詢中添加limit來顯式的限制生成的子查詢結(jié)果集

select type, book_name
from (select * from book order by visits_num desc limit 9999) t1
group by type

Mysql 5.7版本導致的子查詢order by排序無效問題的探究

一、問題背景

在我們的考試系統(tǒng)中,用戶可以多次考試,然后需要去用戶最新的考試記錄,而且是需要批量去取多個用戶的最新的考試記錄或者單個用戶的多個最新考試記錄,之前寫的sql是子查詢根據(jù)時間排序,然后進行分組取最新的。sql如下:

select * from (select * from `user_exam` where uid = 666 and exam_id in (1,2,3) order by create_time desc) as t group by t.exam_id

開始這樣寫的時候,在測試環(huán)境和線上都沒什么問題,不過最近線上有用戶反饋獲取到的考試記錄列表不是最新的,但是測試在測試環(huán)境復現(xiàn)不了,線上能穩(wěn)定復現(xiàn),很是詭異。

二、問題排查

1.檢查相關(guān)緩存,并于數(shù)據(jù)庫數(shù)據(jù)對比,發(fā)現(xiàn)二者并不一致,刪除緩存后,本以為可以正常了,但是獲取后發(fā)現(xiàn)仍是存在問題,更新后的緩存仍然是錯誤數(shù)據(jù);

2.對SQL語句進行排查,語法等均為發(fā)現(xiàn)問題;在本地對sql語句進行執(zhí)行驗證,在我本地執(zhí)行sql語句是正常沒問題的,但是在同事本地執(zhí)行就會出現(xiàn)線上的問題;

同事的Mysql版本如下:

image-20211013214914332

用戶考試記錄數(shù)據(jù)如下:

SELECT * FROM user_exam where exam_id = 156;

image-20211013214749759

該考試僅有一個用戶考試,考了三次,其主鍵id依次為142933、142934、142935.

對比按創(chuàng)建時間排序的子查詢語句獲取到的結(jié)果:

select * from user_exam where uid = 229031 and exam_id=156 order by create_time desc;

image-20211013215339310

根據(jù)創(chuàng)建時間排序,其主鍵id依次仍為142933、142934、142935.

放入group by語句中作為子查詢獲取結(jié)果如下:

select * from (select * from user_exam where uid = 229031 and exam_id = 156 order by create_time desc) as t group by t.exam_id;

image-20211017152439718

我們期望的結(jié)果應該為創(chuàng)建時間最新的用戶考試記錄,即主鍵為142935,但是可以看到,獲取到的結(jié)果并不是最新創(chuàng)建的記錄,而是最早創(chuàng)建的那條用戶考試記錄,我們知道group by 通過分組條件取數(shù)據(jù)時,是取的滿足條件的第一條數(shù)據(jù),那么就好像我們的子查詢中order by create_time desc并沒有起作用。

知道了問題所在,我便從sql語句中order by不起作用作為切入點進行排查,看網(wǎng)上說MySQL的5.7版本當order by在子查詢中時會存在失效情況,對于這種情況,我找了公司運維求證,他們說線上最新的MySQL實例大部分變?yōu)榱?.7,做了升級。這也進一步印證了前面上線后都是正常的,最近才出問題,原因在于當時MySQL版本不是5.7,現(xiàn)在變?yōu)榱?.7版本導致子查詢order by失效。

三、問題解決

看到網(wǎng)上也有網(wǎng)友遇到這個問題,通過在order by 后加limit限制來解決問題,因為在MySQL的5.7版本中,如果group by的子查詢中包含order by,但是order by不與limit配合使用,order by會被忽略掉。嘗試如下:

select * from (select * from user_exam where uid = 229031 and exam_id = 156 order by create_time desc limit 10) as t group by t.exam_id;

image-20211017163110890

通過加limit限制獲取到的結(jié)果是正確的,因為有數(shù)量限制,我們可以把limit的數(shù)值設(shè)置大一些,讓它能cover住所需后取數(shù)量的最大值。

當然還有其他的解決辦法,可以結(jié)合實際的業(yè)務(wù)需求進行優(yōu)化。

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

相關(guān)文章

  • mysql出現(xiàn)錯誤1138-Invalid use of NULL value問題及解決方案

    mysql出現(xiàn)錯誤1138-Invalid use of NULL value問

    遇到1138錯誤因字段含NULL值,需刪除空值并重新設(shè)計表結(jié)構(gòu),確保字段不為空,此為個人經(jīng)驗,希望有所幫助
    2025-08-08
  • 使用Docker安裝并啟動MySQL從零到實戰(zhàn)的完整指南

    使用Docker安裝并啟動MySQL從零到實戰(zhàn)的完整指南

    在使用Docker進行應用程序開發(fā)和部署時,MySQL作為一個常用的數(shù)據(jù)庫管理系統(tǒng),經(jīng)常被使用,這篇文章主要介紹了使用Docker安裝并啟動MySQL的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • mysql如何將表結(jié)構(gòu)導出到excel

    mysql如何將表結(jié)構(gòu)導出到excel

    這篇文章主要介紹了mysql如何將表結(jié)構(gòu)導出到excel,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • mysql cmd常用命令

    mysql cmd常用命令

    mysql cmd常用命令,偶爾需要命令行執(zhí)行mysql的朋友可以參考下。
    2011-05-05
  • MySQL將CSV文件快速導入MySQL中的實現(xiàn)

    MySQL將CSV文件快速導入MySQL中的實現(xiàn)

    本文主要介紹了MySQL將CSV文件快速導入MySQL中的實現(xiàn),主要包括navicat、workbench等軟件中的導入向?qū)謩訉牖蚴褂胠oad data infile命令導入,感興趣的可以了解一下
    2023-11-11
  • 深入淺析Mysql聯(lián)合索引最左匹配原則

    深入淺析Mysql聯(lián)合索引最左匹配原則

    這篇文章主要介紹了Mysql聯(lián)合索引最左匹配原則,使用聯(lián)合索引的好處多多,具體內(nèi)容詳情大家跟隨腳本之家小編一起學習吧
    2018-06-06
  • MySQL查看和修改時區(qū)的實現(xiàn)方法

    MySQL查看和修改時區(qū)的實現(xiàn)方法

    本文主要介紹了MySQL查看和修改時區(qū),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • 讀取mysql一個庫下面的所有的表table

    讀取mysql一個庫下面的所有的表table

    本文給大家分享的是如何使用php實現(xiàn)讀取mysql一個庫下面的所有的表table的代碼,有需要的小伙伴可以參考下
    2016-12-12
  • Mysql應用安裝后找不到my.ini文件的解決過程

    Mysql應用安裝后找不到my.ini文件的解決過程

    剛剛在修改mysql默認配置的時候,發(fā)現(xiàn)找不到my.ini文件,下面這篇文章主要給大家介紹了關(guān)于Mysql應用安裝后找不到my.ini文件的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Linux中安裝MySQL5.7.42的詳細教程

    Linux中安裝MySQL5.7.42的詳細教程

    這篇文章主要介紹了Linux中安裝MySQL5.7.42,本文通過實例圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

泸州市| 鲁甸县| 敦化市| 达尔| 河曲县| 天镇县| 丹东市| 北安市| 杭锦旗| 塘沽区| 灵寿县| 通海县| 留坝县| 南岸区| 临泉县| 鲜城| 绿春县| 长宁县| 灌云县| 陕西省| 邛崃市| 调兵山市| 读书| 柳江县| 积石山| 灌阳县| 河西区| 云霄县| 黔西| 长沙市| 皋兰县| 饶河县| 恩平市| 和田县| 白山市| 滨州市| 江北区| 龙里县| 汉沽区| 呼和浩特市| 革吉县|