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

Mysql樹形表的2種查詢解決方案(遞歸與自連接)

 更新時間:2023年11月25日 08:35:04   作者:懶羊羊.java  
MySQL作為一個關(guān)系型數(shù)據(jù)庫,存儲著許多的數(shù)據(jù)信息,在實際應(yīng)用中經(jīng)常會遇到需要存儲樹形結(jié)構(gòu)數(shù)據(jù)的情境,例如部門結(jié)構(gòu)、商品分類等,這篇文章主要給大家介紹了關(guān)于Mysql樹形表的2種查詢解決方案,分別是遞歸與自連接,需要的朋友可以參考下

你有沒有遇到過這樣一種情況:

一張表就實現(xiàn)了一對多的關(guān)系,并且表中每一行數(shù)據(jù)都存在“爺爺-父親-兒子-…”的聯(lián)系,這也就是所謂的樹形結(jié)構(gòu)

對于這樣的表很顯然想要通過查詢來實現(xiàn)價值絕對是不能只靠select * from table 來實現(xiàn)的,下面提供兩種解決方案:

1.自連接

inner join 關(guān)鍵可以實現(xiàn)多種分類的查詢,其實SQL很簡單

SELECT
	one.id one_id,
	one.label one_label,
	two.id two_id,
	two.label two_label
FROM
	course_category one
	INNER JOIN course_category two ON two.parentid=one.id
	INNER JOIN course_category three ON three.parentid=two.id
	WHERE one.id='1' AND one.is_show='1' AND two.is_show='1'
	ORDER BY one.orderby,two.orderby

也是規(guī)規(guī)矩矩的就查出一整棵樹

這種查詢的原則就是通過parentId去實現(xiàn),“爺爺找爸爸,爸爸找兒子,兒子找孫子”,下面來逐幀慢放:

1.one

2.one,two

3.one,two,three

可以看到,只有在樹的層級確定的情況下我才能選擇性的去自連接子表,某種意義上來講這種方法存在弊端,我要是insert進去層級更低的新子節(jié)點那我的sql就得改變,從而就造成了一個“動一發(fā)而牽全身”的硬編碼問題,實在是不夠穩(wěn)妥!

2.遞歸!

向上遞歸

首先聲明,如果mysql的版本低于8是不支持遞歸查詢的函數(shù)的!

下面來看一下如何用遞歸優(yōu)雅的實現(xiàn),從樹根查到樹頂:

先來看一個簡單的Demo

	with RECURSIVE t1 AS(
		SELECT 1 AS n
		union all
		SELECT n+1 FROM t1 WHERE n<5
	)
	SELECT * from t1

該怎么理解這每一步呢?
 

WITH RECURSIVE t1 AS:

這是遞歸查詢的開始,創(chuàng)建了一個名為t1的遞歸表。

SELECT 1 AS n:

在t1表中,插入了一個初始行,值為1,命名為n。

UNION ALL:

使用UNION ALL運算符將初始行和遞歸查詢結(jié)果合并,形成遞歸步驟。這也就是下次遞歸的起點表

SELECT n+1 FROM t1 WHERE n<5:

遞歸部分的查詢,從t1表中選擇n加1的結(jié)果,當(dāng)n小于5時進行遞歸。

SELECT * FROM t1:

最終查詢,返回t1表的所有行。

其實在使用遞歸的過程只需要注意要去避免死龜就好!

如何去查開頭的那張樹形表呢?這樣就好:

with recursive temp as (
select * from  course_category p where  id= '1'
 union all
select t.* from course_category t inner join temp on temp.id = t.parentid
)
select *  from temp order by temp.id, temp.orderby

下面我們逐幀分析:

其實關(guān)鍵的地方就在于第三步,在樹根的基礎(chǔ)上去找葉子:

神之一手:
select t.* from course_category t inner join temp on temp.id = t.parentid
這就是遞歸相較于第一種方式可以無視層級inner jion的關(guān)鍵,因為這個動作已經(jīng)被遞歸自動完成了,遞歸巧妙地一點就在這里!

向下遞歸

基于向上遞歸父找子的思想,向下遞歸則是子找父,即在葉子基礎(chǔ)上union all之后去找根

子的parentId=父的id

with recursive temp as (
select * from  course_category p where  id= '1-1-1'
 union all
select t.* from course_category t inner join temp on temp.parentid = t.id  
//temp表是下次遞歸的基礎(chǔ)
)
select *  from temp order by temp.id, temp.orderby

值得注意的是Mysql為了避免無限遞歸遞歸次數(shù)為1000次,也可以人為來設(shè)置cte_max_recursion_depth和max_execution_time來自定義遞歸深度和執(zhí)行時間

使用遞歸的好處無需言語,一次io連接就搞定了全部

總結(jié)

到此這篇關(guān)于Mysql樹形表的2種查詢解決方案的文章就介紹到這了,更多相關(guān)Mysql樹形表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql亂碼問題分析與解決方法

    mysql亂碼問題分析與解決方法

    開發(fā)過程中總避免不了遇到惡心的亂碼,或者由亂碼引發(fā)的一系列問題,這里簡要介紹一下自己遇到的亂碼問題和解決問題的過程中的想法以及大致的操作
    2012-11-11
  • MySQL報錯Lost connection to MySQL server during query的解決方案

    MySQL報錯Lost connection to MySQL server&n

    在確保網(wǎng)絡(luò)沒有問題的情況下,服務(wù)器正常運行一段時間后,數(shù)據(jù)庫拋出了異常"Lost connection to MySQL server during query",本文將給大家介紹MySQL報錯Lost connection to MySQL server during query的解決方案,需要的朋友可以參考下
    2024-01-01
  • 詳解mysql數(shù)據(jù)去重的三種方式

    詳解mysql數(shù)據(jù)去重的三種方式

    本文主要介紹了mysql數(shù)據(jù)去重的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • mysql的docker容器如何設(shè)置默認的數(shù)據(jù)庫技巧詳解

    mysql的docker容器如何設(shè)置默認的數(shù)據(jù)庫技巧詳解

    這篇文章主要為大家介紹了mysql的docker容器如何設(shè)置默認的數(shù)據(jù)庫技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • window10中mysql8.0修改端口port不生效的解決方法

    window10中mysql8.0修改端口port不生效的解決方法

    mysql配置文件默認位置,端口號等信息需要在my.ini文件中修改,若修改安裝位置的my-default文件文件或新建my.ini文件是不生效的,本文主要介紹了window10中mysql8.0修改端口port不生效的解決方法,感興趣的可以了解一下
    2023-11-11
  • MySQL查看日志的實現(xiàn)

    MySQL查看日志的實現(xiàn)

    MySQL日志記錄了服務(wù)器的啟動和運行狀態(tài),包括錯誤日志、二進制日志、查詢?nèi)罩竞吐樵內(nèi)罩?這些日志對于故障排除和性能優(yōu)化至關(guān)重要,下面就來詳細的介紹一下
    2026-01-01
  • DBeaver如何將mysql表結(jié)構(gòu)以表格形式導(dǎo)出

    DBeaver如何將mysql表結(jié)構(gòu)以表格形式導(dǎo)出

    DBeaver是一款多功能數(shù)據(jù)庫工具,支持包括MySQL在內(nèi)的多種數(shù)據(jù)庫,本文介紹如何使用DBeaver將MySQL的表結(jié)構(gòu)以表格形式導(dǎo)出,為數(shù)據(jù)庫管理和文檔整理提供便利,這種方法簡潔有效,適合需要文檔化數(shù)據(jù)庫結(jié)構(gòu)的開發(fā)者和數(shù)據(jù)庫管理員
    2024-10-10
  • 淺談mysql可有類似oracle的nvl的函數(shù)

    淺談mysql可有類似oracle的nvl的函數(shù)

    下面小編就為大家?guī)硪黄獪\談mysql可有類似oracle的nvl的函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • mysql派生表(Derived Table)簡單用法實例解析

    mysql派生表(Derived Table)簡單用法實例解析

    這篇文章主要介紹了mysql派生表(Derived Table)簡單用法,結(jié)合實例形式分析了mysql派生表的原理、簡單使用方法及操作注意事項,需要的朋友可以參考下
    2019-12-12
  • MySQL死鎖原因、檢測與解決方案(含詳細圖文)

    MySQL死鎖原因、檢測與解決方案(含詳細圖文)

    死鎖是指兩個或多個事務(wù)在執(zhí)行過程中,因爭奪鎖資源而造成的一種相互等待的現(xiàn)象,若無外力干預(yù),這些事務(wù)將永遠無法繼續(xù)執(zhí)行,這篇文章主要介紹了MySQL死鎖原因、檢測與解決方案的相關(guān)資料,需要的朋友可以參考下
    2026-04-04

最新評論

眉山市| 胶州市| 潮州市| 广南县| 合肥市| 离岛区| 许昌县| 德保县| 张家界市| 砀山县| 民乐县| 石渠县| 昌邑市| 嘉兴市| 方城县| 朝阳市| 南木林县| 五峰| 双辽市| 红原县| 永清县| 县级市| 富裕县| 沾化县| 永善县| 资溪县| 谷城县| 巍山| 塔城市| 肥乡县| 聂荣县| 裕民县| 肃北| 房山区| 漳浦县| 平果县| 南投市| 堆龙德庆县| 南阳市| 四会市| 左贡县|