Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tìm đường dẫn phân cấp cho biểu diễn dạng cây

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 ....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố với các ký tự UTF-8; những gì tôi thấy không phải là những gì tôi đã lưu trữ

  2. Các kết quả khác nhau trong sqlfiddle.com 5.5.30 và MariaDB 5.5.31

  3. Nâng cấp Laravel 5.4, chuyển đổi sang utf4mb từ utf8

  4. Xử lý tính toàn vẹn của cơ sở dữ liệu

  5. MySQL:Đặt tên cho khóa chính trong câu lệnh CREATE TABLE