Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Drzewko - kategorie
Forum PHP.pl > Forum > Przedszkole
d.stp
Robię prosty sklep internetowy i zatrzymałem się na budowie bazy danych bo kurcze nie wiem za bardzo jak rozwiązać problem z kategoriami w sklepie.

Powiedzmy, że mam kilka kategorii:

  1. 1. Telefony
  2. 1.1. Używane
  3. 1.1.1. Działające
  4. 1.1.2. Niedziałające
  5. 1.2. Nowe
  6. 2. Tablety
  7. 2.1. Polskie
  8. 2.2. Chińskie


Coś mniej więcej takiego. Więcej jak 3 poziomy nie powinno być. Teraz zastanawiam się czy takie rozwiązanie jest dobre:

products_categories:
cat_id | cat_parent | cat_name

A w PHP zrobię sobie przy wyświetlaniu:

- sprawdzanie czy w danej kategorii są podkategorie (mysql_num_rows za każdym razem)
- jeśli są to pobiorę wszystkie kategorie o parent_cat = cat_id

Czyli podsumowując do każdego poziomu drzewka zrobiłbym osobne pobieranie kategorii.

Czytałem o tych drzewkach w PHP i MySQL i wyczytałem że ludzie mają właśnie z tym problem bo po stronie mysqla nie ma takiej sztuczki do tego. Wyczytałem też o left i right, ale strasznie te rozwiązanie mi się nie podoba (nie rozumiem go kompletnie).

z góry dzięki za odp
!*!
Cytat(d.stp @ 2.02.2015, 15:00:17 ) *
Czytałem o tych drzewkach w PHP i MySQL i wyczytałem że ludzie mają właśnie z tym problem bo po stronie mysqla nie ma takiej sztuczki do tego. Wyczytałem też o left i right, ale strasznie te rozwiązanie mi się nie podoba (nie rozumiem go kompletnie).


http://piotrekkr.info/2009/08/me-vs-tree-c...-w-mysql-i-php/
Forti
1. Jak często będziesz zmieniał te kategorie?
2. Jak dużo ich jest?

Generalnie, na drzewach na których ja pracuje (gedmo tree najczęściej) jest to tak:

id | parent | level | name | root


Tak będzie najtwiej. Teraz tak:


  1. 1. Telefony (1, null, 1, telefony, 1)
  2. 1.1. Używane (2, 1, 2, uzywane, 1)
  3. 1.1.1. Działające (3, 2, 3, dzialajce, 1)
  4. 1.1.2. Niedziałające (4, 2, 3, niedzialajce, 1)
  5. 1.2. Nowe (5, 1, 2, nowe, 1)
  6. 2. Tablety (6, null, 1, tablety, 2)
  7. 2.1. Polskie (7, 6, 2, polskie, 2)
  8. 2.2. Chińskie (8, 6, 2, chinskie, 2)



W ten sposób możesz:

- pobrać wszystkie liście (dzieci) danej kategorii (parent == ?)
- sprawdzic czy dana kategoria jest kat. główna (parent == null)
- pobrać tylko jedną kategorie główna z dziecmi (root == ?)
- bardzo łątwo całość modyfikować

Może nie napisałęm tego najczytelniej, ale tak to sie mniej więcej robi wink.gif



edit:

to co podał !*!, to left - right system (tak ja to nazywam). Przydaje mi się gdy pracuje na drzewie z 1800 kategorii i 6 poziomami.
d.stp
Dobra w takim razie zrobię tak jak napisałeś bo tego systemu left-right nie ogarniam smile.gif

Korzystam z twojego sposobu, ale mam problem z wyświetleniem produktów z wszystkich kategorii gdzie cat_root = 1

Wygląda to tak:

1. Telefony
1.1. Komórkowe
1.1.1. Używane

I powiedzmy mam kilka rekordów w "Używane" i nie wiem jak wyświetlić że po wejściu w "Telefony" pokaże mi produkty ze wszystkich kategorii należących do głównej czyli "Telefony" bo przecież w tabeli z produktami zapisuje tylko jedną kategorie (w tym przypadku "używane").

I drugie pytanie, czy tworzenie nowego obiektu klasy w pętli (wyświetlanie danych z bazy) to grzech?
Forti
1. To proste. Pobierasz listę kategorii dzieci (wszystkie które root maja 1 lub wg. Patent itp.) i potem produkty dla tych kategorii. Służy do tego IN w zapytaniu mysql. Np.

Select * from products where category_id IN $tablica_z_ids

Kombinuj, musisz zebrac sobie te id wszystkich kategorii. Np select id from category where car_root = 1



2. Jezeli ten obiekt to zapytanie do bazy to jest to grzech bardzo duży.
d.stp
Coś takiego wykombinowałem:

  1. SELECT
  2. *
  3. FROM
  4. products
  5. JOIN
  6. products_cats
  7. WHERE
  8. product_cat_id
  9. IN
  10. (cat_root, cat_id)
  11. ");
  12.  
  13. while ($product = mysql_fetch_assoc($x)) {
  14.  
  15. echo $product['product_name'];
  16.  
  17. }


Chyba działa dobrze, ale pokazuje mi 3 produkty (2 takie same) chociaż w bazie są tylko 2...
Forti
Złe zapytanie. Poczytaj w internecie o relacjach. Przykładów jest całą masa. Gotowca Ci nie dam, ponieważ nie mam i nie znam twojej bazy wink.gif
d.stp
Kategorie:

cat_id | cat_parent_id | cat_level | cat_name | cat_root | cat_rewrite

Produkty

produkt_id | produkt_kat | produkt_name | product_x | product_y

Po lewo mam menu i wyświetlam główne kategorie:

  1. SELECT * FROM products_cats WHERE cat_parent_id IS NULL ORDER BY cat_name


i dalej wyświetlam produkty. Jeśli nie ma $_GET z id kategorii to pokazuje ostatnio dodane produkty ze wszystkich kategorii.

Jeśli user kliknie w kategorie to skrypt sprawdza czy są podkategorie, jeśli są to je wyświetla + pod podkategoriami pokazuje ostatnie XXX produktów z tej kategorii głównej (i tu jest właśnie problem).
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.