Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Drzewko - kategorie
d.stp
post 2.02.2015, 15:00:17
Post #1





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

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


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
Go to the top of the page
+Quote Post
!*!
post 2.02.2015, 15:03:34
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


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/


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Forti
post 2.02.2015, 15:08:37
Post #3





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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.

Ten post edytował Forti 2.02.2015, 15:09:54


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
d.stp
post 16.02.2015, 15:47:01
Post #4





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

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


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?

Ten post edytował d.stp 16.02.2015, 15:47:32
Go to the top of the page
+Quote Post
Forti
post 16.02.2015, 17:36:47
Post #5





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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.


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
d.stp
post 16.02.2015, 18:04:07
Post #6





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

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


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

Ten post edytował d.stp 16.02.2015, 18:04:26
Go to the top of the page
+Quote Post
Forti
post 16.02.2015, 20:04:49
Post #7





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


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


--------------------
Overwatch24 - najbardziej zaawansowany Polski portal Overwatch od fanów dla fanów.

Fachowo.co

Behance.net/fachowo
Go to the top of the page
+Quote Post
d.stp
post 16.02.2015, 21:07:20
Post #8





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

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


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

Ten post edytował d.stp 16.02.2015, 21:09:02
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.04.2024 - 03:33