Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> drzewo kategorii, sprawdzanie przodków i potomków
php programmer
post
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


hej. Mam drzewo kategorii, gdzie każda kategoria ma określonego ojca (lub null gdy jest to kategoria podstawowa). Mam też tabelę produktów, gdzie każdy produkt ma określoną kategorię, jak najdokładniej jak to możliwe, czyli taka kategoria, która nie ma już syna (w drzewie kategorii).

Jak sformułowac (jeśli to możliwe w jednym zapytaniu) coś takiego aby po wybraniu jakieś wyższej kategorii, znajdowało także produkty, które należą do synów danej kategorii.

W zwykłym przypadku, gdyby wszystkie kategorie były by równe i nie było by podziałi drzewiastego zapytanie wyglądało by tak:

SELECT * FROM produkty WHERE produkty.id_kategorii = 120;
Gdzie 120 jest jest numerem id jakiejś tam kategorii.

Ale mi chodzi o takie zapytanie, aby sprawdzało także prodków i potomków,
a dodam że każda kategoria ma określonego jedynie ojca.
Go to the top of the page
+Quote Post
orson
post
Post #2





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam ...

nie da się tego zrobić jednym zapytaniem na bazie którą przedstawiłeś ... musisz pobrać id wszystkich kategorii które cię interesują i do where w pobieraniu dodać FIND_IN_SET(parentID, join(',', kategorie)) > 0

pozdrawiam
Go to the top of the page
+Quote Post
php programmer
post
Post #3





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


A może lepiej będzie jak bym utworzył dodatkową tabelę pełniąca rolę pośrednika
"kategorie_produktów" zawierającą id_prod oraz id_kat.

Wtedy każda kategoria nowa kategoria bez wględu na to gdzie się znajduje w hierarchi drzewa, byłaby odnotowana w tej tabeli. A sprawą ojców i synów zajmowała by się jedynie tabela kategorii.

Może wtedy miałbym wygodniejszą kontrolę nad tym. Co o tym myślicie ?

I jeszcze jedno, w phpMyAdmin przy tworzeniu tabeli jest dużo typów do wyboru, ale nie ma boolean, czy to znaczy, ze w MySQL nie moge wybrac takiego typu?

Ten post edytował php programmer 24.08.2005, 09:14:26
Go to the top of the page
+Quote Post
Shogo
post
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.08.2005

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


Ja bym takie zapytanie widzial tak...
  1. SELECT *
  2. FROM produkty INNER JOIN kategorie ON produkty.id_kategorii = kategorie.id_kategorii
  3. WHERE id_kategorii = 120 OR id_ojca = 120


Powinno dzialac... chyba (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif)

A co do phpMyAdmin'a to zdaje sie ze jest tam cos takiego jak bit (0,1 <- bool ?) (IMG:http://forum.php.pl/style_emoticons/default/cool.gif)
A jezeli nie to mozesz sie pobawic darmowa wersja SQLyog'a
www.webyog.com
Go to the top of the page
+Quote Post
DeyV
post
Post #5





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Cytat(orson)
do where w pobieraniu dodać FIND_IN_SET(parentID, join(',', kategorie)) > 0
A nie wygodniej zkorzystać w takim zapytaniu z IN ?


Aby taka struktura dobrze działała, i łatwo było pobrać wszystkie elementy z danej gałęzi niezbędne jest wykorzsytanie jakiejś lepszej strukury drzewka - np. Drzewko zaprojektowane przez Depesza - niestety - wymagające "prawdziwie" (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) relacyjnej bazy danych. ( http://www.depesz.com/various-sqltrees.php )
Go to the top of the page
+Quote Post
sf
post
Post #6





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


hm, na pewnej angielskiej stronie jest opisane to na przykladzie postgresa i php.. jak sobie radzic z takim czyms, cos ala to do czego linka dal deyv... jest przedstawiona cala struktura tabeli, potem jest w kilku krokach przedstawiona budeowa klasy, ktora to bedzie obslugiwac... pozotaje zainteresowanym poszukac ( przyda sie poniektorym ta umiejetnosc na przyszlosc ;P ) (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
TomASS
post
Post #7





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Cytat(Shogo @ 2005-08-27 13:37:00)
Ja bym takie zapytanie widzial tak...
  1. SELECT *
  2.  
  3. FROM produkty INNER JOIN kategorie ON produkty.id_kategorii = kategorie.id_kategorii
  4. WHERE id_kategorii = 120 OR id_ojca = 120


Powinno dzialac... chyba  (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif)

A co do phpMyAdmin'a to zdaje sie ze jest tam cos takiego jak bit (0,1 <- bool ?) (IMG:http://forum.php.pl/style_emoticons/default/cool.gif)
A jezeli nie to mozesz sie pobawic darmowa wersja SQLyog'a
www.webyog.com

Pewnie, że będzie działać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Zrobiłem menu oparte na rozumowaniu jakie tu zaproponowano. Czyli mamy JEDNĄ tabele z elementami menu. Niestety nie udaje mi się to zebrać w jednym zapytaniu, ponieważ, każda kategoria jest otwierana:
(IMG:http://www.tsl.ehost.pl/images/menu.jpg)
i nie ma zbytnio sensu za każdym razem wczytywania wszystkich podkategorii. Kod nie zawiera więcej niż 120 linii kodu, jak by ktoś chciał, to go mogę tutaj wkleić.

A co do zmiennej boolowskiej:

Prawdopodobnie MySQL nie ma takowej, ja używam zmiennej typu ENUM z wartościami 1 i 0 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam

Ten post edytował TomASS 28.08.2005, 12:15:07
Go to the top of the page
+Quote Post
sf
post
Post #8





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


nie ma booloweskiej, jest ona zamieniana na int(1)
Go to the top of the page
+Quote Post
dassystemZwei
post
Post #9





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 30.08.2005

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


boolowskiej może i nie ma, ale jest enum i można dać enum '0','1' i na jedno wyjdzie..... (IMG:http://forum.php.pl/style_emoticons/default/aarambo.gif)
Go to the top of the page
+Quote Post
TomASS
post
Post #10





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


A co napisałem dwa posty wyżej (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Cytat
Prawdopodobnie MySQL nie ma takowej, ja używam zmiennej typu ENUM z wartościami 1 i 0


(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.09.2025 - 03:36