Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477365
  • 博文数量: 99
  • 博客积分: 3621
  • 博客等级: 中校
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-22 16:29
文章存档

2012年(21)

2011年(28)

2010年(50)

分类: Mysql/postgreSQL

2010-09-17 15:47:23

问题:在表内存有多层父子关系的记录,现在要根据某个父亲节点,找出所有的儿子节点以及孙子节点。。。。
函数如下:
 

mysql> select * from tb;
+------+------+--------+
| id | pid | name |
+------+------+--------+
| 001 | NULL | 广东省 |
| 002 | 001 | 广州市 |
| 003 | 001 | 深圳市 |
| 004 | 002 | 天河区 |
| 005 | 003 | 罗湖区 |
| 006 | 003 | 福田区 |
| 007 | 003 | 宝安区 |
| 008 | 007 | 西乡镇 |
| 009 | 007 | 龙华镇 |
| 010 | 007 | 松岗镇 |
+------+------+--------+
10 rows in set (0.00 sec)

mysql> delimiter //
mysql>
mysql> CREATE FUNCTION `getParentLst`(NodeId CHAR(3))
    -> RETURNS varchar(1000)
    -> DETERMINISTIC
    -> -- READS SQL DATA
    -> BEGIN
    -> DECLARE sTemp VARCHAR(1000);
    -> DECLARE sTempChd VARCHAR(1000);
    ->
    -> SET sTemp = '$';
    -> set sTempChd=NodeId;
    -> label1: LOOP
    -> SET sTemp = concat(sTemp,',',sTempChd);
    -> SELECT pid INTO sTempChd FROM tb where id=sTempChd;
    -> IF FOUND_ROWS()=0 or sTempChd is null THEN
    -> RETURN sTemp;
    -> END IF;
    -> END LOOP label1;
    -> RETURN sTemp;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> select getParentLst('010');
+---------------------+
| getParentLst('010') |
+---------------------+
| $,010,007,003,001 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from tb
    -> where find_in_set(id , getParentLst((select id from tb where name='松岗镇') ));
+------+------+--------+
| id | pid | name |
+------+------+--------+
| 001 | NULL | 广东省 |
| 003 | 001 | 深圳市 |
| 007 | 003 | 宝安区 |
| 010 | 007 | 松岗镇 |
+------+------+--------+
4 rows in set (0.00 sec)

mysql> select * from tb
    -> where find_in_set(id , getParentLst((select id from tb where name='宝安区') ));
+------+------+--------+
| id | pid | name |
+------+------+--------+
| 001 | NULL | 广东省 |
| 003 | 001 | 深圳市 |
| 007 | 003 | 宝安区 |
+------+------+--------+
3 rows in set (0.02 sec)

mysql>


以上脚本来自CSDN。链接如下:

阅读(3797) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-17 16:20:51

http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx 狼头哥强悍的帖子。提出了解决树状查询的三种方法。