MySQL 中没有支持递归的查询,自行编写函数实现。
如数据库里有部门表dept,字段有id、name、pid
create table dept(
id int(11) not null,
name varchar(20),
pid int(11) not null,
primary key(id)
);
插入数据:
insert into dept(id,name,pid) values(1,'A',0);
insert into dept(id,name,pid) values(2,'B',0);
insert into dept(id,name,pid) values(3,'A1',1);
insert into dept(id,name,pid) values(4,'A2',1);
insert into dept(id,name,pid) values(5,'A11',3);
insert into dept(id,name,pid) values(6,'A21',4);
insert into dept(id,name,pid) values(7,'A22',4);
查询:
select * from dept;
+----+------+-----+
| id | name | pid |
+----+------+-----+
| 1 | A | 0 |
| 2 | B | 0 |
| 3 | A1 | 1 |
| 4 | A2 | 1 |
| 5 | A11 | 3 |
| 6 | A21 | 4 |
| 7 | A22 | 4 |
+----+------+-----+
编写函数:
CREATE FUNCTION `getChild`(rootId varchar(36)) RETURNS varchar(1000)
BEGIN
DECLARE ptemp VARCHAR(1000);
DECLARE ctemp VARCHAR(1000);
SET ptemp = '#';
SET ctemp = rootId;
WHILE ctemp IS NOT NULL DO
SET ptemp = concat(ptemp, ',', ctemp);
SELECT group_concat(id)
INTO ctemp
FROM dept
WHERE FIND_IN_SET(pid, ctemp) > 0;
END WHILE;
RETURN ptemp;
END
自定义函数说明:
参数rootId为指定门店ID,ptemp为最终返回变量,ctemp为中间变量,最终返回是“#,1,2”格式的字符串。