Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wywołanie określonej gałęzi z drzewa kategorii
grz16w
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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.

Ten post edytował grz16w 10.08.2011, 06:49:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


a ja polecam Ci nested sets.
Go to the top of the page
+Quote Post
grz16w
post
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grz16w
post
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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

Ten post edytował grz16w 10.08.2011, 20:12:07
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grz16w
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 06:10