mysql递归查询。

chinagavin 2009-04-27 09:38:50
mysql> select * from testdb;
+------+------+------+
| id | name | pid |
+------+------+------+
| 1 | a | 0 |
| 2 | a | 1 |
| 3 | b | 1 |
| 4 | b | 2 |
| 5 | c | 2 |
| 6 | c | 3 |
| 7 | c | 0 |
| 8 | d | 0 |
| 9 | e | 7 |
+------+------+------+
9 rows in set (0.00 sec)

这样的表结构,如何查询出id = 1的记录机器子记录。
谢谢。
就是一个mysql递归查询的过程。
...全文
402 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
坤霆 2009-09-30
  • 打赏
  • 举报
回复
请问楼主 存储过程如何实现?我也遇到这个问题,能贴出来么?谢谢。
chinagavin 2009-04-28
  • 打赏
  • 举报
回复
谢谢。不过存储过程我已经实现了。
看来mysql还是不如oracle提供的那个比较好用。
ACMAIN_CHM 2009-04-27
  • 打赏
  • 举报
回复

直接用SQL语句无法实现,可以利用存储过程(procedure 或 function )

mysql> create table testdb (
-> id int primary key,
-> name varchar(10),
-> pid int
-> );
Query OK, 0 rows affected (0.17 sec)

mysql>
mysql> insert into testdb values
-> (1 ,'a',0),
-> (2 ,'a',1),
-> (3 ,'b',1),
-> (4 ,'b',2),
-> (5 ,'c',2),
-> (6 ,'c',3),
-> (7 ,'c',0),
-> (8 ,'d',0),
-> (9 ,'e',7);
Query OK, 9 rows affected (0.06 sec)
Records: 9 Duplicates: 0 Warnings: 0

mysql> set global log_bin_trust_function_creators=on ;
Query OK, 0 rows affected (0.00 sec)

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

mysql>
mysql> delimiter ;

mysql> select *
-> from testdb
-> where FIND_IN_SET(id,getChildLst(1));
+----+------+------+
| id | name | pid |
+----+------+------+
| 1 | a | 0 |
| 2 | a | 1 |
| 3 | b | 1 |
| 4 | b | 2 |
| 5 | c | 2 |
| 6 | c | 3 |
+----+------+------+
6 rows in set (0.01 sec)


56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧