mysql实现类似oracle的connect by功能
2015-05-12 11:31
295 查看
1.生成测试表与数据:
create table mytest
(
id int primary key,
nodename varchar(20),
pid int
);
insert into mytest (id,nodename,pid)values( 1 ,'A', 0);
insert into mytest (id,nodename,pid)values( 2 ,'B', 1);
insert into mytest (id,nodename,pid)values( 3 ,'C', 1);
insert into mytest (id,nodename,pid)values( 4 ,'D', 2);
insert into mytest (id,nodename,pid)values( 5 ,'E', 2);
insert into mytest (id,nodename,pid)values( 6 ,'F', 3);
insert into mytest (id,nodename,pid)values( 7 ,'G', 6);
insert into mytest (id,nodename,pid)values( 8 ,'H', 0);
insert into mytest (id,nodename,pid)values( 9 ,'I', 8);
insert into mytest (id,nodename,pid)values( 10 ,'J', 8);
insert into mytest (id,nodename,pid)values( 11 ,'K', 8);
insert into mytest (id,nodename,pid)values( 12 ,'L', 9);
insert into mytest (id,nodename,pid)values( 13 ,'M', 9);
insert into mytest (id,nodename,pid)values( 14 ,'N',12);
insert into mytest (id,nodename,pid)values( 15 ,'O',12);
insert into mytest (id,nodename,pid)values( 16 ,'P',15);
insert into mytest (id,nodename,pid)values( 17 ,'Q',15);
2.创建函数:
delimiter $$
CREATE FUNCTION `getParentList` (rootId VARCHAR (50)) RETURNS VARCHAR (1000)
BEGIN
DECLARE sParentList VARCHAR (1000) ;
DECLARE sParentTemp VARCHAR(1000);
SET sParentTemp =CAST(rootId AS CHAR);
WHILE sParentTemp IS NOT NULL DO
IF (sParentList IS NOT NULL) THEN
SET sParentList = CONCAT(sParentTemp,'/',sParentList);
ELSE
SET sParentList = CONCAT(sParentTemp);
END IF;
SELECT GROUP_CONCAT(pid) INTO sParentTemp FROM mytest WHERE FIND_IN_SET(id,sParentTemp)>0;
END WHILE;
RETURN sParentList;
END$$
DELIMITER ;
3.测试验证:
set global log_bin_trust_function_creators=1;
SELECT id,pid,getParentList(id) FROM mytest;
mysql> SELECT id,pid,getParentList(id) FROM mytest;
+----+------+-------------------+
| id | pid | getParentList(id) |
+----+------+-------------------+
| 1 | 0 | 0/1 |
| 2 | 1 | 0/1/2 |
| 3 | 1 | 0/1/3 |
| 4 | 2 | 0/1/2/4 |
| 5 | 2 | 0/1/2/5 |
| 6 | 3 | 0/1/3/6 |
| 7 | 6 | 0/1/3/6/7 |
| 8 | 0 | 0/8 |
| 9 | 8 | 0/8/9 |
| 10 | 8 | 0/8/10 |
| 11 | 8 | 0/8/11 |
| 12 | 9 | 0/8/9/12 |
| 13 | 9 | 0/8/9/13 |
| 14 | 12 | 0/8/9/12/14 |
| 15 | 12 | 0/8/9/12/15 |
| 16 | 15 | 0/8/9/12/15/16 |
| 17 | 15 | 0/8/9/12/15/17 |
+----+------+-------------------+
17 rows in set (0.01 sec)
本文出自 “webseven” 博客,请务必保留此出处http://webseven.blog.51cto.com/4388012/1650540
create table mytest
(
id int primary key,
nodename varchar(20),
pid int
);
insert into mytest (id,nodename,pid)values( 1 ,'A', 0);
insert into mytest (id,nodename,pid)values( 2 ,'B', 1);
insert into mytest (id,nodename,pid)values( 3 ,'C', 1);
insert into mytest (id,nodename,pid)values( 4 ,'D', 2);
insert into mytest (id,nodename,pid)values( 5 ,'E', 2);
insert into mytest (id,nodename,pid)values( 6 ,'F', 3);
insert into mytest (id,nodename,pid)values( 7 ,'G', 6);
insert into mytest (id,nodename,pid)values( 8 ,'H', 0);
insert into mytest (id,nodename,pid)values( 9 ,'I', 8);
insert into mytest (id,nodename,pid)values( 10 ,'J', 8);
insert into mytest (id,nodename,pid)values( 11 ,'K', 8);
insert into mytest (id,nodename,pid)values( 12 ,'L', 9);
insert into mytest (id,nodename,pid)values( 13 ,'M', 9);
insert into mytest (id,nodename,pid)values( 14 ,'N',12);
insert into mytest (id,nodename,pid)values( 15 ,'O',12);
insert into mytest (id,nodename,pid)values( 16 ,'P',15);
insert into mytest (id,nodename,pid)values( 17 ,'Q',15);
2.创建函数:
delimiter $$
CREATE FUNCTION `getParentList` (rootId VARCHAR (50)) RETURNS VARCHAR (1000)
BEGIN
DECLARE sParentList VARCHAR (1000) ;
DECLARE sParentTemp VARCHAR(1000);
SET sParentTemp =CAST(rootId AS CHAR);
WHILE sParentTemp IS NOT NULL DO
IF (sParentList IS NOT NULL) THEN
SET sParentList = CONCAT(sParentTemp,'/',sParentList);
ELSE
SET sParentList = CONCAT(sParentTemp);
END IF;
SELECT GROUP_CONCAT(pid) INTO sParentTemp FROM mytest WHERE FIND_IN_SET(id,sParentTemp)>0;
END WHILE;
RETURN sParentList;
END$$
DELIMITER ;
3.测试验证:
set global log_bin_trust_function_creators=1;
SELECT id,pid,getParentList(id) FROM mytest;
mysql> SELECT id,pid,getParentList(id) FROM mytest;
+----+------+-------------------+
| id | pid | getParentList(id) |
+----+------+-------------------+
| 1 | 0 | 0/1 |
| 2 | 1 | 0/1/2 |
| 3 | 1 | 0/1/3 |
| 4 | 2 | 0/1/2/4 |
| 5 | 2 | 0/1/2/5 |
| 6 | 3 | 0/1/3/6 |
| 7 | 6 | 0/1/3/6/7 |
| 8 | 0 | 0/8 |
| 9 | 8 | 0/8/9 |
| 10 | 8 | 0/8/10 |
| 11 | 8 | 0/8/11 |
| 12 | 9 | 0/8/9/12 |
| 13 | 9 | 0/8/9/13 |
| 14 | 12 | 0/8/9/12/14 |
| 15 | 12 | 0/8/9/12/15 |
| 16 | 15 | 0/8/9/12/15/16 |
| 17 | 15 | 0/8/9/12/15/17 |
+----+------+-------------------+
17 rows in set (0.01 sec)
本文出自 “webseven” 博客,请务必保留此出处http://webseven.blog.51cto.com/4388012/1650540
相关文章推荐
- oracle实现类似mysql的LIMIT,也可以作为oracle分页使用
- MySQl里类似Oracle rownum的实现
- MySql实现类似Oracle中Row_number功能
- Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
- MYSQL 存储过程实现类似ORACLE row_number 和 rank 的简单例子
- 在MySQL中实现插入或更新操作(类似Oracle的merge语句)
- mysql中实现类似oracle中的nextval函数
- MySQL实现类似Oracle中的decode()函数的功能见解 乐杨俊
- mysql中类似oracle的over分组实现
- MySQL实现类似Oracle序列的函数
- MySQL实现类似Oracle的序列
- 对字符串的“sum”——Oracle里实现类似MySQL group_concat函数
- mysql中实现类似oracle中的nextval函数
- mysql使用federated_实现类似oracle的dblink的功能
- Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
- MySQL实现类似Oracle中start with功能
- mysql中使用tee实现类似oracle spool功能
- mysql中实现类似oracle中的nextval函数
- MySQL实现类似Oracle的序列 - sequence
- MySQL实现类似Oracle的序列