![]() |
![]() |
![]()
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 |
|
|
![]() |
![]()
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.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
a ja polecam Ci nested sets.
|
|
|
![]()
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... |
|
|
![]()
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:
Prościej się chyba nie da. ![]() -------------------- ![]() 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! |
|
|
![]()
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? ![]() ![]() 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 |
|
|
![]()
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. ![]() -------------------- ![]() 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! |
|
|
![]()
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
![]() ![]() myślę że pozostałe operacje teraz pójdą prawidłowo ![]() 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 ![]() |
|
|
![]()
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. ![]() -------------------- ![]() 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! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 06:10 |