Wczoraj cały dzień próbowałem zrobić drzewo kategorii w prostym sklepie na własnym skrypcie i nic z tego nie wyszło... Przeczytałem wiele artykułów o tym i dalej nic... metodą prób i błędów udało mi się dojść do tego, że drzewko działa dla max. dwóch poziomów, a tutaj jest potrzebne minimum 3.

Tabela `produkty` wygląda tak:

product_id | product_cat_id | product_name

1 | 5 | 'Tir',
2 | 5 | 'Nowy tir',
3 | 3 | 'Auto osobowe'

Tabela `kategorie`:

cat_id | cat_parent | cat_level | cat_root | cat_name

1 | NULL | 0 | 1 | 'Samochody',
2 | NULL | 0 | 2 | 'Motocykle',
3 | NULL | 1 | 1 | 'Osobowe',
4 | NULL | 1 | 1 | 'Dostawcze',
5 | NULL | 4 | 1 | 'Tiry'

Mam menu w którym wyświetlam sobie wszystkie kategorie główne w ten sposób:

SELECT * FROM kategorie WHERE cat_parent IS NULL ORDER BY cat_name

I pokazuje mi wszystkie kategorie główne. Po wejściu w kategorię np. "Samochody" pokazuje mi podkategorie (jeśli istnieją) oraz pod nimi listę produktów z kategorii głównej (czyli "Samochody"), a jeżeli nie istnieją podkategorie to pokazuje tylko produkty z tej kategorii. Na tym etapie jest wszystko dobrze.

Ten skrypt:

  1. SELECT *
  2. FROM
  3. kategorie as cat, produkty as prod
  4. WHERE
  5. prod.product_cat_id = cat.cat_id AND
  6. cat.cat_root = '".$cat['cat_root']."'
  7. ORDER BY
  8. prod.product_id DESC


Wcześniej sobie sprawdzam czy dana kategoria ma jakieś podkategorie, czy istnieją w niej produkty itd.

Po wejściu w "Samochody" > "Osobowe" (gdzie nie ma już podkategorii dalej i jest jeden produkt też ładnie działa. Kod za to odpowiedzialny:

  1. SELECT *
  2. FROM
  3. produkty
  4. WHERE
  5. product_cat_id = '".$cat['cat_id']."'
  6. ORDER BY
  7. product_id DESC


Wcześniej podobnie jak wyżej sprawdzam czy istnieją podkategorie, jeśli nie to wrzucam to zapytanie wyżej, a jeśli istnieją to te jeszcze wyżej.

Problem zaczyna się jak wejdę w "Samochody" > "Dostawcze". W tej podkategorii powinno pokazać mi dwa rekordy, a pokazuje wszystkie rekordy gdzie cat_root = x co w sumie jest normalne bo przecież taki jest warunek... problem w tym że nie wiem jak to inaczej zapisać, a jak usunę to cat.cat_root = '".$cat['cat_root']."' to wtedy nie pokaże mi produktów po wejściu w kategorię główną...

Kombinowałem też z cat_level, ale tak samo bez pozytywnych skutków... a takie cuda robiłem, że nie jeden czarodziej by się zawstydził