Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie określonej gałęzi z drzewa kategorii
Forum PHP.pl > Forum > PHP
grz16w
Witam. Próbowałem sam wymyślić na to sposób jednak mi się nie udało. Mam tabelę "kategorie", w której ma strukturę:

Cytat
ID | Name | isParent | parentID | Position


Pole "Position" służy do sortowania elementów wewnątrz tego samego rodzica, polem "isParent" sprawdzam czy dany element ma potomków a pole "parentID" to wiadomo. Mój problem polega na tym że nie wiem jak jednym zapytaniem (lub jak najmniejszą ich ilością i pętlą php) pobrać tylko jedną gałąź drzewa czyli podając ID rodzica pobieram rodzica i jego wszystkich potomków i pod-potomków itd. Jak to wykonać i czy w tym układzie to w ogóle możliwe? Pozdrawiam

P.S. Jeżeli w nieprawidłowym dziale to przepraszam.
phpion
Zależy ile masz kategorii w bazie danych. Jeśli nie jest ich kosmicznie dużo to warto rozważyć zastosowanie rozwiązania, które ja stosuję. Pobieram 1 zapytaniem wszystkie rekordy kategorii i w PHP buduję odpowiednią strukturę drzewiastą jako obiekt Tree. Mając taki obiekt załadowany operacje na kategoriach odbywają się bez udziału bazy danych. Wybieranie dzieci danej kategorii (czyli to co chcesz), tworzenie ścieżki kategorii itd. to po prostu zadanie klasy Tree. Dodając do tego mechanizm cache drzewo kategorii zrzucam do pliku i stamtąd pobieram przy kolejnych żądaniach. To rozwiązanie na pewno zużywa więcej pamięci niż każdorazowe odwoływanie się do bazy danych tylko po wycinek danych, ale w przypadku stosunkowo niewielkich drzew kategorii (nie podam Ci konkretnej wartości) sprawdza się wyśmienicie.
lukaskolista
a ja polecam Ci nested sets.
grz16w
Cytat
Zależy ile masz kategorii w bazie danych. Jeśli nie jest ich kosmicznie dużo to warto rozważyć zastosowanie rozwiązania, które ja stosuję. Pobieram 1 zapytaniem wszystkie rekordy kategorii i w PHP buduję odpowiednią strukturę drzewiastą jako obiekt Tree. Mając taki obiekt załadowany operacje na kategoriach odbywają się bez udziału bazy danych. Wybieranie dzieci danej kategorii (czyli to co chcesz), tworzenie ścieżki kategorii itd. to po prostu zadanie klasy Tree. Dodając do tego mechanizm cache drzewo kategorii zrzucam do pliku i stamtąd pobieram przy kolejnych żądaniach. To rozwiązanie na pewno zużywa więcej pamięci niż każdorazowe odwoływanie się do bazy danych tylko po wycinek danych, ale w przypadku stosunkowo niewielkich drzew kategorii (nie podam Ci konkretnej wartości) sprawdza się wyśmienicie.


Właśnie chodzi o to że potrzebuję takiego rozwiązania z myślą o nieograniczonej liczbie kategorii ;/ nested sets używałem, ale tam dużo kombinacji (i parę zapytań) wychodzi na każdą operację chociażby przenoszenia kategorii do innej...
erix
Cytat
Mój problem polega na tym że nie wiem jak jednym zapytaniem (lub jak najmniejszą ich ilością i pętlą php) pobrać tylko jedną gałąź drzewa czyli podając ID rodzica pobieram rodzica i jego wszystkich potomków i pod-potomków itd. Jak to wykonać i czy w tym układzie to w ogóle możliwe? Pozdrawiam

Korzystam z tego typu drzewka od dawna z jednego powodu - jest piekielnie szybkie, jeśli chodzi o pobieranie (pobranie całego drzewa, to tylko jedno zapytanie).

Jest jedna różnica między moim a Twoim - w moim przypadku jest jeszcze kolumna depth, która jest tu kluczowa. Jeśli tego nie masz, pobranie dzieci będzie wymagało wywoływania zapytań rekurencyjnie.

Jeśli już utworzysz depth, działanie algorytmu będzie dość proste: pobierasz depth dla pożądanego węzła, zapisujesz sobie position. Po czym szukasz najbliższego węzła o takim samym depth sortując po position. Zapisujesz sobie jego position.

I wtedy, aby pobrać wszystkie dzieci danego węzła wykonujesz jedno zapytanie. Zadeklarujmy sobie następujące zmienne - węzeł pożadany ma d1, p1, węzeł zakańczający d2 i p2:

  1. WHERE position >= p1 AND position <= p2 ORDER BY position


Prościej się chyba nie da. wink.gif
grz16w
Jednak sobie nie mogę wyobrazić (płytka wyobraźnia) jak w taki sposób pobierać wszystkie możliwe dzieci (i ich dzieci, i dzieci ich dzieci itd.) jednego rodzica na podstawie podanego tylko jego ID i mając to dodatkowe pole depth ;/ i jeszcze nie wywołując dla każdego poziomu (depth) kolejnego zapytania SELECT..

jakaś dodatkowa pomoc? smile.gif wiem, że wymagam wiele ale na pewno nie tylko ja z tego skorzystam smile.gif

edit: dodam tylko że pole position służy mi jedynie do sortowania dzieci o tym samym rodzicu..
erix
Cytat
jakaś dodatkowa pomoc? wiem, że wymagam wiele ale na pewno nie tylko ja z tego skorzystam

http://eriz.pcinside.pl/weblog/php-feat-my...rzewka-143.html

Cytat
edit: dodam tylko że pole position służy mi jedynie do sortowania dzieci o tym samym rodzicu..

Uhm? W moim przypadku warunek jest taki, że wszystkie elementy są kolejno posortowane, od pierwszego do ostatniego, niezależnie od stopnia zagłębienia. Jakbyś spłaszczył (depth=0), to będzie w tej samej kolejności dzięki temu.

Myśl, myśl, myśl. wink.gif
grz16w
A bo to przez moje nieprawidłowe interpretowanie pola Position smile.gif sciana.gif

myślę że pozostałe operacje teraz pójdą prawidłowo smile.gif choć już mnie martwi
Cytat
Jeśli już utworzysz depth, działanie algorytmu będzie dość proste: pobierasz depth dla pożądanego węzła, zapisujesz sobie position. Po czym szukasz najbliższego węzła o takim samym depth sortując po position. Zapisujesz sobie jego position.


jak to zrobić gdy to jest ostatni element na danym depth i nie ma już następnego węzła, tylko na przykład węzeł wyższego poziomu... Albo ja już nie umiem myśleć albo praca mnie wykańcza wstydnis.gif
erix
Cytat
jak to zrobić gdy to jest ostatni element na danym depth i nie ma już następnego węzła, tylko na przykład węzeł wyższego poziomu... Albo ja już nie umiem myśleć albo praca mnie wykańcza

Dlatego wspomniałem o:

Cytat
I wtedy, aby pobrać wszystkie dzieci danego węzła wykonujesz jedno zapytanie. Zadeklarujmy sobie następujące zmienne - węzeł pożadany ma d1, p1, węzeł zakańczający d2 i p2:

P2 zawiera pozycję elementu węzłu wyższego poziomu; dostosuj sobie tylko strzałki. wink.gif
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.