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

關(guān)于 MySQL 嵌套子查詢中無法關(guān)聯(lián)主表字段問題的解決方法

 更新時間:2022年12月26日 09:46:25   作者:bananaplan  
這篇文章主要介紹了關(guān)于 MySQL 嵌套子查詢中,無法關(guān)聯(lián)主表字段問題的折中解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

今天在工作中寫項目的時候,遇到了一個讓我感到幾乎無解的問題,在轉(zhuǎn)換了思路后,想出了一個折中的解決方案,記錄如下。

其實,問題的場景,非常簡單:

就是需要查詢出上圖的數(shù)據(jù),紅框是從 項目產(chǎn)品表 中查詢的2個字段,綠框是從與項目產(chǎn)品表關(guān)聯(lián)的 文章表 中查詢出的1個字段。我希望實現(xiàn)的效果是,獲取到項目產(chǎn)品對應(yīng)的文章提交人數(shù),即該項目產(chǎn)品,有多少人提交了文章。看似很簡單啊,于是我開始擼 SQL 語句了。

先寫個雛形

既然在查詢項目產(chǎn)品表的時候,希望多查詢1列數(shù)據(jù),而此列數(shù)據(jù)是從其他關(guān)聯(lián)表獲取的,所以基本實現(xiàn)方式,是使用子查詢。

SELECT s.id, s.name, (SELECT COUNT(*) FROM art_subject_article WHERE subject_id = s.id) AS article_num
FROM crm_subject s
ORDER BY article_num DESC;

獲得結(jié)果如下:

這個 SQL 語句,查詢出了項目產(chǎn)品所對應(yīng)的文章數(shù),下面基于它再做個優(yōu)化調(diào)整,把查詢到的文章數(shù)量 article_num 變?yōu)樘峤晃恼碌挠脩魯?shù)量 member_num。

再優(yōu)化一下,意外發(fā)生了

現(xiàn)在不是直接從文章表中,獲取文章數(shù)量了,而是需要先根據(jù)文章表中的用戶ID進行分組,獲得分組數(shù)據(jù)之后,再通過 count(*) 聚合函數(shù),拿到用戶數(shù)量。于是繼續(xù)調(diào)整 SQL 如下:

SELECT s.id, s.name, (SELECT count(*) FROM (SELECT mg_userid FROM art_subject_article WHERE subject_id = s.id GROUP BY mg_userid) t) AS member_num
FROM crm_subject s
ORDER BY member_num DESC;

但是,運行卻報錯了:

報錯信息說:s.id 字段找不到。這是一個嵌套的子查詢,在嵌套的最內(nèi)層的子查詢中,關(guān)聯(lián)外部表的字段,是無法關(guān)聯(lián)的。雖然我沒找根據(jù),但通過報錯信息,也能大致看出一二。而且,在 DataGrip 中,把鼠標(biāo)放到 s.id 上面時,也會出現(xiàn)一個提示:

雖然這個提示,我也不甚明了,但是感覺上,好像就是在告訴我,你無法關(guān)聯(lián)到外部表的字段。

好像無解了,轉(zhuǎn)變思路,柳暗花明

上面的 SQL 語句,看起來是如此的完美,可是就是有問題、不成立,咋辦?

突然,靈機一動,想到一個方案,姑且一試。既然在嵌套的最內(nèi)層的子查詢中,做 WHERE subject_id = s.id 與主表的字段關(guān)聯(lián)行不通,那么,就不在內(nèi)層的子查詢中做關(guān)聯(lián),把它提到外層的子查詢中去,不就行的通了嘛。于是,改造 SQL 如下:

SELECT s.id, s.name, (SELECT count(*) FROM (SELECT subject_id, mg_userid FROM art_subject_article GROUP BY subject_id, mg_userid) t WHERE t.subject_id = s.id) AS member_num
FROM crm_subject s
ORDER BY member_num DESC;

主要關(guān)注子查詢這里的改造,我們可以把這里的子查詢做個分解。

首先,可以把子查詢看成這樣:(SELECT count(*) FROM t WHERE t.subject_id = s.id) AS member_num,把它理解成從 t 表中查詢與主表的項目產(chǎn)品有關(guān)的記錄數(shù)量。

然后,我們再把 t 表看成 (SELECT subject_id, mg_userid FROM art_subject_article GROUP BY subject_id, mg_userid) t,代表從文章表中查詢出每個產(chǎn)品對應(yīng)的用戶ID。

最后把2個子查詢,整合起來,就實現(xiàn)了查詢項目產(chǎn)品表中,每個產(chǎn)品所對應(yīng)的提交了文章的用戶數(shù)量。

有沒有更好的解決方案

這個折中的方案,雖然可以解決我的問題,但是,我依然想知道,有沒有更好的、更標(biāo)準(zhǔn)的最佳實踐。

并且此方案,也有3點不足:

  • 改進前我們是對文章表做項目產(chǎn)品關(guān)聯(lián)查詢后再分組,改進后是對文章表做全表掃描后的分組,效率較低,在大數(shù)據(jù)下的表現(xiàn)不好。
  • 優(yōu)化方案是基于兩層嵌套的子查詢進行的,假如需要三層嵌套的子查詢,此方案估計又失效了。
  • 此優(yōu)化方案較為局限,不具有普適性,不能很好的適用于各種業(yè)務(wù)場景。

所以,我將我遇到的這個問題,和解決方案分享在此,希望能幫助到有緣人,同時,也期望各位大神能夠不吝賜教,分享一下最佳實踐。

后記

我沉下心來,真的去谷歌上找證據(jù)去了,還真被我找到了,你猜怎么著,此問題真的是,無解?。?!

這是我搜索到的線索,其中 https://bugs.mysql.com/bug.php?id=28814 這里有個人遇到了與我一樣的問題,并且在下面的評論回復(fù)中,有個人拋出了 MySQL 的官方文檔,證實了此問題的存在,不是 bug,而是 MySQL 本身就不支持。

這里引用官方文檔的說明:

A correlated column can be present only in the subquery's WHERE clause (and not in the SELECT list, a JOIN or ORDER BY clause, a GROUP BY list, or a HAVING clause). Nor can there be any correlated column inside a derived table in the subquery's FROM list.

注意第二句話:“子查詢的 FROM 列表中的派生表內(nèi)也不能有任何關(guān)聯(lián)字段”。直接就給想要這么做的小伙伴們判了死刑,還真TM無解。

既然這種寫法不支持,那么有沒有什么替代方案?答案在這里找到了:https://dba.stackexchange.com/questions/237181/nested-subquery-giving-eror-of-unknown-column

里面也提供了非常有價值的信息:

在 MySQL 8.0.14 版本中,優(yōu)化了關(guān)聯(lián)子查詢不能用在 FROM 中的問題,從這個版本開始,可以使用了?。?!撒花,慶祝。。。

然而悲催的是,大多數(shù)的小伙伴們,用的都是 5.6 或 5.7 的版本吧,那么這個問題的唯一解法就是:不要在 FROM 的子查詢中,使用字段關(guān)聯(lián)。。。

好了,都被我猜對了,我真是個天才。第一,此問題真的無解;第二,想要解決,真的只能用迂回的、折中的解決方案。

看起來,有的時候,自己就是自己的救世主,自己就是那個期盼的大神。。。

到此這篇關(guān)于關(guān)于 MySQL 嵌套子查詢中,無法關(guān)聯(lián)主表字段問題的折中解決方法的文章就介紹到這了,更多相關(guān)MySQL 嵌套子查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL對數(shù)據(jù)庫操作(創(chuàng)建、選擇、刪除)

    MySQL對數(shù)據(jù)庫操作(創(chuàng)建、選擇、刪除)

    這篇文章主要介紹了MySQL如何對數(shù)據(jù)庫操作,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 使用Rotate Master實現(xiàn)MySQL 多主復(fù)制的實現(xiàn)方法

    使用Rotate Master實現(xiàn)MySQL 多主復(fù)制的實現(xiàn)方法

    眾所周知,MySQL只支持一對多的主從復(fù)制,而不支持多主(multi-master)復(fù)制
    2012-05-05
  • MySQL數(shù)據(jù)表的常見約束小結(jié)

    MySQL數(shù)據(jù)表的常見約束小結(jié)

    在數(shù)據(jù)庫設(shè)計中,約束(Constraints)是用于確保數(shù)據(jù)的完整性、準(zhǔn)確性和一致性的規(guī)則,MySQL?提供了多種約束類型,幫助我們規(guī)范數(shù)據(jù)存儲,本文給大家介紹了MySQL數(shù)據(jù)表的常見約束,需要的朋友可以參考下
    2024-12-12
  • 如何測試mysql觸發(fā)器和存儲過程

    如何測試mysql觸發(fā)器和存儲過程

    本文將詳細(xì)介紹怎樣mysql觸發(fā)器和存儲過程,需要了解的朋友可以詳細(xì)參考下
    2012-11-11
  • 深入解析半同步與異步的MySQL主從復(fù)制配置

    深入解析半同步與異步的MySQL主從復(fù)制配置

    這篇文章主要介紹了半同步與異步的MySQL主從復(fù)制配置,包括不同的連接方案的討論,需要的朋友可以參考下
    2015-12-12
  • win8.1安裝mysql5.6時遇到問題解決方案

    win8.1安裝mysql5.6時遇到問題解決方案

    本文主要記錄的是作者在win8.1安裝mysql5.6時遇到問題的解決方案,網(wǎng)上查了很多方法都沒能解決,這里把最后的方法分享給大家
    2016-10-10
  • MySQL 5.7新特性介紹

    MySQL 5.7新特性介紹

    這篇文章主要為大家詳細(xì)介紹了MySQL 5.7新特性,了解一下MySQL 5.7的部分新功能,需要的朋友可以參考下
    2016-06-06
  • MySQL 空間碎片的查看與回收

    MySQL 空間碎片的查看與回收

    ySQL數(shù)據(jù)庫在運行過程中可能會出現(xiàn)空間碎片的問題,本文就來介紹一下MySQL 空間碎片的查看與回收 ,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 三十分鐘MySQL快速入門(圖解)

    三十分鐘MySQL快速入門(圖解)

    通過分享本文帶領(lǐng)大家三十分鐘入門mysql,包括sql的基礎(chǔ)知識,creat語法知識,非常不錯,具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • mysql使用force index的問題解決

    mysql使用force index的問題解決

    FORCE INDEX是MySQL中的一個查詢提示,本文主要介紹了mysql使用force index的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評論

井研县| 开远市| 鹤岗市| 福海县| 鹿邑县| 托克逊县| 陇西县| 商河县| 宾川县| 科尔| 得荣县| 永春县| 土默特左旗| 泰宁县| 冀州市| 太白县| 新源县| 咸宁市| 天门市| 尖扎县| 稻城县| 昌图县| 广汉市| 高碑店市| 长泰县| 施秉县| 乐亭县| 梓潼县| 肇州县| 滕州市| 伊川县| 奉节县| 盘山县| 葫芦岛市| 青阳县| 三门县| 都昌县| 卢湾区| 淳安县| 虹口区| 喀什市|