Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewko z bazy, jak pobrać wszystkie poziomy zaglębienia?
Forum PHP.pl > Forum > Bazy danych
miedzna
Witajcie, mam drzewko w bazie o strukturze:

ID | Name | Parent

kopiując jakoś gałąź kopiuję ją wraz z podzakładkami i wykonuję zapytanie w stylu

SELECT * FROM tabela WHERE Parent = 1

i w ten sposób pobieram wszystkie dzieci zakładki o ID 1, a jak wykonać zapytanie, żeby pobrać wszystkie dzieci dzieci, czyli wnuki zakładki o ID 1, jakaś funkcja rekurencyjny, ale jak ją zbudować, macie jakieś pomysły?
Shili
Zrób sobie funkcję powiedzmy pobierz(id)
z zawartością
Kod
SELECT * FROM tabela WHERE Parent = id
while(są wyniki) {
    zmienna = pobierz id z kolejnego wyniku
    wywolaj pobierz(zmienna)
}
osiris
jesli Twoj silnik bazodanowy obsługuje CTE (Common Table Expressions) to najlepiej tego uzyc. przyklad:
  1. CREATE TABLE MenuPositions(
  2. PosId INT PRIMARY KEY,
  3. Nazwa VARCHAR(30) NOT NULL,
  4. Url VARCHAR(50) NOT NULL,
  5. ParentId INT NULL REFERENCES MenuPositions(PosId)
  6. );
  7.  
  8. WITH MenuTree(Id, Nazwa, Url, Poziom)
  9. AS (
  10. SELECT m.PosId, m.Nazwa, m.Url, 1 AS Poziom
  11. FROM MenuPositions AS m
  12. WHERE m.ParentId IS NULL
  13. UNION ALL
  14. SELECT m.PosId, CONVERT(VARCHAR, REPLICATE(' ', Poziom) + m.Nazwa), m.Url, Poziom + 1
  15. FROM MenuPositions AS m
  16. INNER JOIN MenuTree AS t ON m.ParentID = t.Id
  17. )
  18. SELECT Id, Nazwa, Url, Poziom
  19. FROM MenuTree

MS SQL to obsluguje, MySQL niestety nie. W Oracle'u jesli dobrze pamietam mozna osiagnac to samo z uzyciem klauzuli CONNECT BY

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.