在很多業務場景中,我們需要從資料庫查詢一些樹狀結構的資料,多半以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 可以根據...