在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。
在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。
但很多时候我们无法控制树的深度。这时就需要在MySQL中用存储过程来实现或在你的程序中来实现这个递归。本文讨论一下几种实现的方法。
样例数据:
mysql> create table treeNodes
(id intprimary key,nodename varchar(20),pid int);
-> Query OK, 0rows affected (0.09sec)
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|
+----+----------+------+
17rows in set (0.00sec)
树形图如下
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
方法一:利用函数来得到所有子节点号。
创建一个function getChildLst, 得到一个由所有子节点号组成的字符串.
mysql> delimiter //
mysql>
mysql> CREATE FUNCTION `getChildLst`(rootId INT)
RETURNS varchar(1000)
BEGIN