Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z pobraniem produktów z drzewa spełniających okreslone warunki
nowy_pehapowiec
post 17.10.2009, 17:48:29
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 24.08.2009

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


Witam,
jest jakieś drzewo, powiedzmy, że produktów (id | parentid). Do produktów są przypisane tagi (osobna tabela z tagami i tabela łącząca). I teraz chce wyświetlić wszystkie produkty mające przypisany jakiś tag. Ale chcę wyświetlić je w formie drzewa (kilka poziomów). I teraz jest trudność, bo tagi przypisuje zwykle do produktów (nie do kategorii). Czyli pobranie tabeli z drzewem z prostym warunkiem WHERE odpada, bo jeśli jakiś rodzic nie ma odpowiedniego tagu to nie zostanie wyświetlony, jego dzieci też nie. A jeśli mają odpowiedni tag to powinny. Np rodzic "monitory" nie ma tagu lcd, jego potomek "monitory lcd" już ma ten tag, i oczywiście wszystkie monitory lcd w grupie "monitory lcd" mają tag lcd. Pobierając drzewo z prostym warunkiem WHERE nie wyświetlę kategorii "monitory" bo nie ma tagu lcd, czyli nie wyświetlę żądnych monitorów.

Nie mam pojęcia jak to zrobić żeby było dobrze. Jedyne co wymyśliłem to mając id (powiedzmy 12345) kategorii mógłbym rekurencyjnie sprawdzać czy któryś z potomków na dowolnym poziomie nie ma odpowiedniego tagu. Jeśli ma to wyświetlam kolejnych potomków kategorii o id=12345 aż dojdę do produktu który ma szukany tag. I tak dla każdego id. Bardzo zagmatwane. Jak to lepiej zrobić??

Wyświetlane produktów jako listy odpada ma być drzewko biggrin.gif Uwziąłem się i chcę się dowiedzieć jak to wykonać.

pozdro

questionmark.gifquestionmark.gif
Go to the top of the page
+Quote Post
seth-kk
post 17.10.2009, 18:04:25
Post #2





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

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


zainwestuj w lepsza strukture drzewa - np taka jak proponuje tutaj zyx


--------------------
Go to the top of the page
+Quote Post
nowy_pehapowiec
post 19.10.2009, 09:16:20
Post #3





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 24.08.2009

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


A korzystając ze struktury drzewa opartej na adresach ip da się to zrobić? Bardzo mi na tym zależy.

pozdro
Go to the top of the page
+Quote Post
cudny
post 19.10.2009, 14:34:40
Post #4





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Tutaj może pomóc join left jeśli cię dobrze zrozumiałem.
Musisz sobie poczytać - na forum jest sporo na ten temat.
Łączysz dwie tabele i masz wszystkie info - a jeśli coś nie istnieje to zwraca wartość NULL

Jeśli nie o to chodziło to daj znać.

pzdr


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
Go to the top of the page
+Quote Post
vokiel
post 19.10.2009, 16:52:01
Post #5





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Może pomoże Ci info na blogu Mateusza Wójcika: Drzewa kategorii w SQL i PHP metodą IP


--------------------
Go to the top of the page
+Quote Post
wlamywacz
post 19.10.2009, 20:13:52
Post #6





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Według mnie najlepszym sposobem jest nestedset gdyż drzewka IP strasznie obciążają bazę danych. Ja aktualnie korzystam z własnej wariacji nestedset, gdzie mam dostęp do alfabetycznego sortowania i patha kategorii bez pobierania drzewa/gałęzi co było straszną udręką standardowego implementacji nestedset.
Go to the top of the page
+Quote Post
nowy_pehapowiec
post 20.10.2009, 11:44:32
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 24.08.2009

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


Cytat(cudny @ 19.10.2009, 15:34:40 ) *
Tutaj może pomóc join left jeśli cię dobrze zrozumiałem.
Musisz sobie poczytać - na forum jest sporo na ten temat.
Łączysz dwie tabele i masz wszystkie info - a jeśli coś nie istnieje to zwraca wartość NULL

Jeśli nie o to chodziło to daj znać.
[xml][/xml]
pzdr


Aż tak słaby z sql nie jestem smile.gif Ale chodzi o to jak pobrać drzewo drzewo spełniające okreslone warunki. Np tag=super. Powiedzmy, że jest produkt spełniający ten warunek, ale jego rodzic już go nie spełnia. Więc jak pobieram drzewo od góry (pobieram dzieci najstarszego elementu, potem to samo dla pobranych wcześniej dzieci) i dam warunek where to jeśli w drzewie pojawi się element nie spełniający warunku to nie zostanie on wyświetlony i jego dzieci również, mimo że może spełniają warunek. Chyba powinienem inaczej pobierać drzewo, tylko nie bardzo wiem jak.






Cytat(vokiel @ 19.10.2009, 17:52:01 ) *


Znam tą stronę, jest super wszystko wyjaśnione, ale nie ma nic o wybieranie gałęzi drzewa z warunkami.






Zapomniałem się jeszcze zapytać, czy drzewo z bazy lepiej jest pobierać jednym zapytaniem, czy wieloma? Teraz pobieram wieloma zapytaniami. Po kolei wszystkie dzieci jakiegoś rodzica, potem dzieci dzieci. Czyli bardzo dużo pytań SELECT, między którymi wyświetlam listę nieuporządkowaną w html. Czy jeśli szybkość jest nadal na akceptowalnym poziomie, to warto zmienić tą moją metodę? Np pobrać tabelę z drzewem do PHP i później w samym PHP generować z niej odpowiednią strukturę drzewa? Byłoby dużo więcej roboty ale może warto?


pozdro
Go to the top of the page
+Quote Post
vokiel
post 20.10.2009, 14:07:33
Post #8





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


O ile pamiętam z Twojego wcześniejszego opisu, to produkty wraz z kategoriami są w jednej tabeli, różnią się tylko tym, że produkty nie mają potomków.
Zakładam coś w rodzaju:
| ID | PARENT_ID | CHILDREN | NAME | DESC |

Czyli w zasadzie możesz pobrać w wszystkie rekordy, wraz z rodzicami, dla których ID istnieje w tabeli PRODUCTS_TAGS dla wybranego tagu.


--------------------
Go to the top of the page
+Quote Post
wlamywacz
post 20.10.2009, 16:43:42
Post #9





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Cytat
Aż tak słaby z sql nie jestem smile.gif Ale chodzi o to jak pobrać drzewo drzewo spełniające okreslone warunki. Np tag=super. Powiedzmy, że jest produkt spełniający ten warunek, ale jego rodzic już go nie spełnia. Więc jak pobieram drzewo od góry (pobieram dzieci najstarszego elementu, potem to samo dla pobranych wcześniej dzieci) i dam warunek where to jeśli w drzewie pojawi się element nie spełniający warunku to nie zostanie on wyświetlony i jego dzieci również, mimo że może spełniają warunek. Chyba powinienem inaczej pobierać drzewo, tylko nie bardzo wiem jak.

Zastosuj zwykłe nestedset z lef joinem dla tagów i warunkiem having lub where.
Go to the top of the page
+Quote Post
nowy_pehapowiec
post 21.10.2009, 07:19:04
Post #10





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 24.08.2009

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


Cytat(vokiel @ 20.10.2009, 15:07:33 ) *
O ile pamiętam z Twojego wcześniejszego opisu, to produkty wraz z kategoriami są w jednej tabeli, różnią się tylko tym, że produkty nie mają potomków.
Zakładam coś w rodzaju:
| ID | PARENT_ID | CHILDREN | NAME | DESC |

Czyli w zasadzie możesz pobrać w wszystkie rekordy, wraz z rodzicami, dla których ID istnieje w tabeli PRODUCTS_TAGS dla wybranego tagu.


Tak dokładnie to mam:
id | parentid | ipadress | depth
To czy jakiś produkt ma potomków to sprawdzam w sql. Szukam takich id które występują albo nie w kolumnie parentid dla innych produktów. Tylko co zrobić jak już mam pobraną całą tabelę do php? Wcześniej pobierałem kolejne gałęzie drzewa osobnymi SELECT. Nie wiem jak w php z tabeli drzewa wygenerować zagnieżdżoną listę.

pozdro
Go to the top of the page
+Quote Post
xajart
post 16.11.2009, 00:30:43
Post #11





Grupa: Zarejestrowani
Postów: 141
Pomógł: 1
Dołączył: 2.12.2008

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


to co chciałeś uzyskać, moim zdaniem się da, jeżeli dobrze zrozumiałem

Powiązania:
Tagi => (są przypisane do) produktów
produkty => do kategorii 
kategorie zaś są w formie drzewa IP

Algorytm:
- sprawdzasz które produkty mają przypisany TAG i wybierasz je => t[id_produktu]
- pobierasz wszystkie wiersze tabeli kategorii
- sprawdzasz czy id_produktu_przypisanego_do_kategori == t[id_produktu]
- jeżeli tak to tworzysz zmienną tablicową - do której przypisujesz rozbity ipadres
na jego podstawie jestes w stanie zidentyfikować kategorie nadrzędne, a z wyświetleniem w sposób hierarchiczny nie powinno już być problemu.

Ten post edytował xajart 16.11.2009, 00:33:01
Go to the top of the page
+Quote Post
cudny
post 30.12.2009, 01:52:35
Post #12





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Trochę późno na odpowiedź ale może się komuś to przyda.
Chodzi tu o funkcję rekurencyjną - zainteresowanych odsyłam do Wikipedii.

  1.  
  2. function category($parent_id = 1, $i = 0){
  3. $query = mysql_query("select * from category where parent_id='".$parent_id."'");
  4. $q= mysql_fetch_array($query);
  5.  
  6. $tree[$i] = array(
  7. 'id' => $q['id'],
  8. 'nazwa' => $q['nazwa'],
  9. 'costam' => $q['costam'],
  10. 'reszta_tablicy' => $q['reszta_tablicy']
  11. );
  12.  
  13. $i++;
  14.  
  15. category($q['id'], $i);
  16.  
  17. return $tree;
  18. };
  19.  


Funkcja w rezultacie zwraca pełne drzewo kategorii do ostatniej z nich.
Tak samo można zrobić drzewo folderów - przecież nigdy nie wiemy ile ich się zagnieżdża w sobie.
Powyższa funkcja tworzy tylko drzewko do nawigacji - aby wyświetlić pełne drzewko, np. w znacznikach <ul> <li> i do tego jeszcze wiedzieć, który akurat jest katalog otwarty trzeba napisać sobie funkcję/metodę, która utworzy ścieżkę dostępu po parent_id do "zerowej" kategorii.
Tutaj już sami ruszcie głową smile.gif

Jak co to piszcie na PW

pzdr
Cudny


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
Go to the top of the page
+Quote Post
wlamywacz
post 7.01.2010, 14:53:57
Post #13





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Lepiej pokaż jak stoi to z wydajnością. Poza tym tworzenie zaawansowanych drzew w mysql na hostingu jest masakrą. Większość firm nie udostępnia mysql w wersji 5.1.x w której nie trzeba mieć administratora aby tworzyć funkcję. Polecam przejście na pgsql (ltree, depesz itp.)

Ten post edytował wlamywacz 7.01.2010, 14:54:22
Go to the top of the page
+Quote Post
cudny
post 11.01.2010, 23:56:10
Post #14





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Tutaj mogę się zgodzić tylko z wydajnością.
Oczywiście spowalnia to strasznie serwer ale możesz tak jak już napisałem stworzyć tablicę do nawigacji jednym zapytaniem.
Dalej lecisz po tablicy fereachem ile razy chcesz.
Co nie zmienia faktu, że pierwsza funkcja robi mnóstwo zapytań.
No ale mówimy tu o drzewie podkategorii - jakoś trzeba to rozwiązać.

Co do mysql'a to i tak wydajniej jest obsłużyć większość zapytań w php rozbijając to na porcje.
Poza tym to co tyczy się pssql - polecam artykuł http://www.eioba.pl/a77069/jak_dziala_mysq...m_optymalizacje
myisam jest po prostu dużo szybszy w każdym wypadku.
Fakt nie obsługuje transakcji ale tutaj polecam zend FM lub jakikolwiek inny FM, mają pełno klas wspomagających te rozwiązania.

Acha - nie chcę tutaj w żadnym wypadku dyskryminować pssql.
Wiele osób napisze, ze jest o wiele lepszy, itp.
Ja na ten temat się nie wypowiem.
Mogę powiedzieć, tylko że rezygnując z wydajności silnika myisam w mysql możemy skorzystać ze stabilności i funkcjonalności silnika innodb w mysql.


Pozdrawiam
cudny

Ten post edytował cudny 12.01.2010, 00:03:50


--------------------
..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
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 Wersja Lo-Fi Aktualny czas: 18.06.2025 - 08:45