mysql實現父子遞迴查詢sql

2021-10-04 13:34:05 字數 1087 閱讀 3198

在很多業務場景中,我們需要從資料庫查詢一些樹狀結構的資料,多半以id,pid的形式儲存記錄。

在oracle中,能夠通過語法輕鬆實現父子級間的遞迴查詢,無論到父,子,孫,曾孫等多少級,都能查出來。

但是在mysql中,就沒有像oracle中那樣有現成的語法直接呼叫了。

設表test有以下字段:id,name,pid;

idname

pid1父親0

2兒子13

孫子24曾孫

35伯伯0

我們可以使用以下語法進行查詢(假設知道兒子的id):

select * from test

where id in(

select id from

(select id,pid from test where pid> 0 order by pid, id desc

) t1,

(select @pv := 2) t2

where (find_in_set(pid,@pv)>0 and @pv := concat(@pv, ',', id)) )

union 

select * from test where id = 2

以上語法@pv:=2 表示在sql中使用pv做乙個臨時的變數,儲存後端傳過來的引數,在後面的sql中可以隨意使用這個變數。

find_in_set(a,b)語法表示在b集合中【結構為(1,2,3)這樣的】這樣的結構中查詢有a的記錄,返回這個記錄。

上述語法的解釋就是:

1. 查詢test表裡所有非父類的集合,作為in的篩選集合t1;

2. 設定臨時變數pv = 傳過來的id值:2;

3. 遍歷篩選t1中pid等於變數pv值2的記錄,同時還要把這個符合的記錄拼接進變數pv裡,假設當前遍歷查詢到符合條件的記錄id為3,那這輪輪詢後pv的值變成了「2,3」了;

4. 按照3的步驟一直輪詢,最後遞迴查出父id為2的所有子孫後代的id集合;

5. 查詢test表中id在這些id集合的資料,最後union上父親本身。

最後查出結果為:

idname

pid1父親0

2兒子13

孫子24曾孫

3

MySQL遞迴查詢父子節點

create table folder id bigint 20 not null,parent id bigint 20 default null,primary key id 建立函式 create function getparlist rootid bigint returns varcha...

mysql 函式實現父子查詢

1 根據 子節點查詢父節點 返回的是id鏈 建立mysql自定義函式,新建mysql函式必須通過mysql commond line鍵入命令列的方式進行建立,而不能通過第三方提供的圖形化資料庫操作軟體來建立 使用命令列 定義函式獲取當前序列值 c users user1 mysql u root p...

Mysql中的遞迴層次查詢(父子查詢)

在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢?在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式 下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。建立表treenodes 可以根據...