首先创建一个熟悉的机构表
插入几条测试数据:
union all上面的是初始化语句,只会执行一次,查到了 开发部 这一行记录。
接下来下面的join会用初始化的语句去原来的organization表去join获取所有 开发部的子部门 ,然后再用这些 子部门 去join更下面的部门。
执行的结果如下:
如下想查询开发部的所有上级部门的话上面的递归查询语句简单改一下就可以了:
执行结果如下:
Recursive Common Table Expression 'temp' can contain neither
aggregation nor window functions in recursive query block
mysql
mysql对递归的深度是有限制的,默认的递归深度是1000。
可以通过 show variables like 'cte_max_recursion_depth'进行查看
也可以通过select语句最大执行时间对递归加以显示, show variables lile 'max_execution_time'
给你个网上写的比较好的例子:
方法一:利用函数来得到所有子节点号。
创建一个function getChildLst, 得到一个由所有子节点号组成的字符串.
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函数配合这个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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)