亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

1.自連接

inner join 關鍵可以實現(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運算符將初始行和遞歸查詢結果合并,形成遞歸步驟。這也就是下次遞歸的起點表

SELECT n+1 FROM t1 WHERE n<5:

遞歸部分的查詢,從t1表中選擇n加1的結果,當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

下面我們逐幀分析:

其實關鍵的地方就在于第三步,在樹根的基礎上去找葉子:

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

向下遞歸

基于向上遞歸父找子的思想,向下遞歸則是子找父,即在葉子基礎上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表是下次遞歸的基礎
)
select *  from temp order by temp.id, temp.orderby

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

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

總結

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

相關文章

  • mysql獲取隨機數(shù)據(jù)的方法

    mysql獲取隨機數(shù)據(jù)的方法

    在mysql中獲取隨機數(shù)據(jù)方法很簡單只要使用order by rand()即可了,但是如果你是百萬級數(shù)據(jù)量,使用order by rand()獲取隨機數(shù)據(jù)你會等死去,下面我來介紹具體的解決辦法
    2013-11-11
  • MySQL?varchar(n)能存儲幾個漢字

    MySQL?varchar(n)能存儲幾個漢字

    這篇文章主要介紹了MySQL varchar(n)能存儲幾個漢字,MySQL中varchar(n)表示n個字符,無論漢字和英文,Mysql都能存入n個字符,僅是實際字節(jié)長度有所區(qū)別,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎

    詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎

    在本文里我們給大家總結了關于MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎的相關知識點,需要的讀者們一起學習下。
    2019-02-02
  • MySQL數(shù)據(jù)庫常見字段類型長度匯總大全

    MySQL數(shù)據(jù)庫常見字段類型長度匯總大全

    這篇文章主要給大家介紹了關于MySQL數(shù)據(jù)庫常見字段類型長度匯總大全的相關資料,需要的朋友可以參考下
    2024-05-05
  • MySQL批量插入唯一索引沖突的幾種避免辦法

    MySQL批量插入唯一索引沖突的幾種避免辦法

    我們在進行大批量的數(shù)據(jù)插入時,遇到唯一索引沖突是經(jīng)常的事,本文主要介紹了MySQL批量插入唯一索引沖突的幾種避免辦法,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Mysql利用group by分組排序

    Mysql利用group by分組排序

    這篇文章主要為大家詳細介紹了Mysql利用group by分組排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 幾種MySQL中的聯(lián)接查詢操作方法總結

    幾種MySQL中的聯(lián)接查詢操作方法總結

    這篇文章主要介紹了幾種MySQL中的聯(lián)接查詢操作方法總結,文中包括一些代碼舉例講解,需要的朋友可以參考下
    2015-04-04
  • mysql免安裝版配置教程

    mysql免安裝版配置教程

    這篇文章主要為大家詳細介紹了mysql免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 如何批量生成MySQL不重復手機號大表實例代碼

    如何批量生成MySQL不重復手機號大表實例代碼

    這篇文章主要給大家介紹了關于如何批量生成MySQL不重復手機號大表的相關資料,,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • MySQL 索引優(yōu)化案例

    MySQL 索引優(yōu)化案例

    這篇文章主要介紹了MySQL 索引優(yōu)化案例,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08

最新評論