sql >> Database >  >> RDS >> Mysql

Hoe het hiërarchiepad voor een boomweergave te vinden

U kunt kiezen voor een opgeslagen procedure zoals u in uw vraag hebt vermeld, aangezien de nesting tot 7 niveaus diep kan zijn.

Opgeslagen procedure

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

Om het eigenlijke record te controleren, hebben we zojuist de gewone records met een null-waarde in de padkolom afgedrukt

select * from foo

Resultaten :

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

De procedure aanroepen :

call updatepath

Resultaat na uitvoering van procedure :

select * from foo

Resultaten :

| 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

Ik hoop dat dit helpt ....



  1. Tabellen ontgrendelen als draad verloren gaat

  2. Oracle JDeveloper gebruiken met MySQL Database Service op Oracle Cloud Platform, deel 3

  3. MariaDB JSON_UNQUOTE() uitgelegd

  4. MySQL wait_timeout variabele - GLOBAL vs SESSION