Bạn có thể thực hiện với một quy trình được lưu trữ như bạn đã đề cập trong câu hỏi của mình vì lồng có thể sâu tới 7 cấp.
Quy trình được lưu trữ
CREATE PROCEDURE updatePath()
BEGIN
declare cnt, n int;
select count(*) into n from foo where parent_id is null;
update foo a, foo b set a.path = b.name where b.parent_id is null and a.parent_id = b.id;
select count(*) into cnt from foo where path is null;
while cnt > n do
update foo a, foo b set a.path = concat(b.path, '/', b.name) where b.path is not null and a.parent_id = b.id;
select count(*) into cnt from foo where path is null;
end while;
END//
Để kiểm tra bản ghi thực tế, chúng tôi chỉ in các bản ghi thuần túy có giá trị null trong cột đường dẫn
select * from foo
Kết quả :
| ID | NAME | PARENT_ID | PATH |
------------------------------------------
| 1 | root1 | (null) | (null) |
| 2 | child1 | 1 | (null) |
| 3 | subchild1 | 2 | (null) |
| 4 | child2 | 1 | (null) |
| 5 | child3 | 1 | (null) |
| 6 | subchild2 | 4 | (null) |
| 7 | subsubchild1 | 6 | (null) |
Gọi thủ tục :
call updatepath
Kết quả sau khi thực hiện thủ tục :
select * from foo
Kết quả :
| ID | NAME | PARENT_ID | PATH |
----------------------------------------------------------
| 1 | root1 | (null) | (null) |
| 2 | child1 | 1 | root1 |
| 3 | subchild1 | 2 | root1/child1 |
| 4 | child2 | 1 | root1 |
| 5 | child3 | 1 | root1 |
| 6 | subchild2 | 4 | root1/child2 |
| 7 | subsubchild1 | 6 | root1/child2/subchild2 |
SQLFIDDLE
Hy vọng điều này sẽ giúp ....