sql >> Databasteknik >  >> RDS >> Mysql

Hur man hittar hierarkivägen för en trädrepresentation

Du kan gå med en lagrad procedur som du har nämnt i din fråga eftersom kapslingen kan vara upp till 7 nivåer djup.

Lagrad procedur

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

För att kontrollera den faktiska posten skrev vi bara ut de vanliga posterna med nollvärde i sökvägskolumnen

select * from foo

Resultat :

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

Anropar proceduren :

call updatepath

Resultat efter körning av proceduren :

select * from foo

Resultat :

| 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

Hoppas detta hjälper...



  1. MySQL-fel För många anslutningar

  2. Kunde inte ansluta:Förlorade anslutningen till MySQL-servern vid "läsning av initialt kommunikationspaket", systemfel:0

  3. N:te maxlön i Oracle

  4. VARCHAR som främmande nyckel/primärnyckel i databasen bra eller dåligt?