日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用函数来得到所有子节点号 利用函数来取得最高级的节点号

發(fā)布時間:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用函数来得到所有子节点号 利用函数来取得最高级的节点号 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY 我們可以方便的查了所有當(dāng)前節(jié)點下的所有子節(jié)點。但很遺憾,在MySQL的目前版本中還沒有對應(yīng)的功能。?

在MySQL中如果是有限的層次,比如我們事先如果可以確定這個樹的最大深度是4, 那么所有節(jié)點為根的樹的深度均不會超過4,則我們可以直接通過left join 來實現(xiàn)。?

但很多時候我們無法控制樹的深度。這時就需要在MySQL中用存儲過程來實現(xiàn)或在你的程序中來實現(xiàn)這個遞歸。本文討論一下幾種實現(xiàn)的方法。?

樣例數(shù)據(jù):

mysql> create table treeNodes
??? -> (
??? ->? id int primary key,
??? ->? nodename varchar(20),
??? ->? pid int
??? -> );
Query OK, 0 rows affected (0.09 sec)?
mysql> select * from treenodes;
+----+----------+------+
| id | nodename | pid? |
+----+----------+------+
|? 1 | A??????? |??? 0 |
|? 2 | B??????? |??? 1 |
|? 3 | C??????? |??? 1 |
|? 4 | D??????? |??? 2 |
|? 5 | E??????? |??? 2 |
|? 6 | F??????? |??? 3 |
|? 7 | G??????? |??? 6 |
|? 8 | H??????? |??? 0 |
|? 9 | I??????? |??? 8 |
| 10 | J??????? |??? 8 |
| 11 | K??????? |??? 8 |
| 12 | L??????? |??? 9 |
| 13 | M??????? |??? 9 |
| 14 | N??????? |?? 12 |
| 15 | O??????? |?? 12 |
| 16 | P??????? |?? 15 |
| 17 | Q??????? |?? 15 |
+----+----------+------+
17 rows in set (0.00 sec)?

樹形圖如下?

1:A
? +-- 2:B
? |??? +-- 4:D
? |??? +-- 5:E
? +-- 3:C
?????? +-- 6:F
??????????? +-- 7:G
8:H
? +-- 9:I
? |??? +-- 12:L
? |??? |??? +--14:N
? |??? |??? +--15:O
? |??? |??????? +--16:P
? |??? |??????? +--17:Q
? |??? +-- 13:M
? +-- 10:J
? +-- 11:K???

方法一:利用函數(shù)來得到所有子節(jié)點號。?

創(chuàng)建一個function getChildLst, 得到一個由所有子節(jié)點號組成的字符串.??

mysql> delimiter //
mysql>
mysql> CREATE FUNCTION `getChildLst`(rootId INT)
??? -> RETURNS varchar(1000)
??? -> BEGIN
??? ->?? DECLARE sTemp VARCHAR(1000);
??? ->?? DECLARE sTempChd VARCHAR(1000);
??? ->
??? ->?? SET sTemp = '$';
??? ->?? SET sTempChd =cast(rootId as CHAR);
??? ->
??? ->?? WHILE sTempChd is not null DO
??? ->???? SET sTemp = concat(sTemp,',',sTempChd);
??? ->???? SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0;
??? ->?? END WHILE;
??? ->?? RETURN sTemp;
??? -> END
??? -> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;?

使用我們直接利用find_in_set函數(shù)配合這個getChildlst來查找?

mysql> select getChildLst(1);
+-----------------+
| getChildLst(1)? |
+-----------------+
| $,1,2,3,4,5,6,7 |
+-----------------+
1 row in set (0.00 sec)?
mysql> select * from treeNodes
??? -> where FIND_IN_SET(id, getChildLst(1));
+----+----------+------+
| id | nodename | pid? |
+----+----------+------+
|? 1 | A??????? |??? 0 |
|? 2 | B??????? |??? 1 |
|? 3 | C??????? |??? 1 |
|? 4 | D??????? |??? 2 |
|? 5 | E??????? |??? 2 |
|? 6 | F??????? |??? 3 |
|? 7 | G??????? |??? 6 |
+----+----------+------+
7 rows in set (0.01 sec)
mysql> select * from treeNodes
??? -> where FIND_IN_SET(id, getChildLst(3));
+----+----------+------+
| id | nodename | pid? |
+----+----------+------+
|? 3 | C??????? |??? 1 |
|? 6 | F??????? |??? 3 |
|? 7 | G??????? |??? 6 |
+----+----------+------+
3 rows in set (0.01 sec)?

優(yōu)點:?簡單,方便,沒有遞歸調(diào)用層次深度的限制 (max_sp_recursion_depth,最大255) ;?

缺點:長度受限,雖然可以擴大 RETURNS varchar(1000),但總是有最大限制的。?

MySQL目前版本( 5.1.33-community)中還不支持function 的遞歸調(diào)用。

?

總結(jié)

以上是生活随笔為你收集整理的利用函数来得到所有子节点号 利用函数来取得最高级的节点号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。