Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak znaleźć ścieżkę hierarchii dla reprezentacji drzewa?

Możesz skorzystać z procedury składowanej, jak wspomniałeś w swoim pytaniu, ponieważ zagnieżdżenie może mieć głębokość do 7 poziomów.

Procedura przechowywana

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

Aby sprawdzić rzeczywisty rekord, po prostu wydrukowaliśmy zwykłe rekordy o wartości null w kolumnie ścieżka

select * from foo

Wyniki :

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

Wywołanie procedury :

call updatepath

Wynik po wykonaniu procedury :

select * from foo

Wyniki :

| 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

Mam nadzieję, że to pomoże...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica między LIKE i =w MYSQL?

  2. Jak importować i eksportować pliki CSV za pomocą PHP i MySQL

  3. Liczba powiązanych zmiennych PHP Mysql PDO nie odpowiada liczbie tokenów

  4. Dane open source rosną:wybór MySQL, NoSQL lub obu

  5. Po zainstalowaniu MySQL przez Brew otrzymuję błąd - Serwer zakończył pracę bez aktualizacji pliku PID