dawid17
25.10.2016, 10:01:38
Mam następujący problem:
Buduję drzewo kategorii sklepu i w nim znajdują się trzy tabele:
- tabela kategorie - zawiera: id_kategorii | nazwe_kategorii
- tabela podkategorie - zawiera: id_podkategorii | nazwe_podkategorii
- tabela łącząca obie powyższe - zawiera: id | id_kategorii | id_podkategorii | id_produktu(z tabeli produkty)
Po pierwsze to nie mam pojęcia czy taka struktura jest w ogóle poprawna.
Sytuacja wygląda w ten sposób że Każda kategoria może posiadać kilka podkategorii a każda z podkategorii może należeć do kilku kategorii.
Chciałbym zadać zapytanie do MYSQL które zwróci mi wynik:
kategoria_1 - podkategoria_1
- podkategoria_3
- podkategoria_4
kategoria_2 - podkategoria_1
- podkategoria_2
- podkategoria_4
Potrzebuję takiego wyniku aby przy pomocy pętli w php wygenerować drzewo kategorii własnie w ten sposób
Na tą chwilę cały czas otrzymuje coś takiego:
kategoria_1 - podkategoria_1
kategoria_1 - podkategoria_3
kategoria_1 - podkategoria_4
kategoria_2 - podkategoria_1
kategoria_2 - podkategoria_2
kategoria_2 - podkategoria_4
Zastanawiam się i głowie. Dochodzę do wniosków, że takie zapytanie nie jest w ogóle możliwe i trzeba przebudować strukturę bazy (ale w takim wypadku jak powinna ona wyglądać?) lub szukać rozwiązania w kodzie php?
Pyton_000
25.10.2016, 11:47:59
Zainteresuj się strukturami drzewiastymi.
Nested Set - średni poziom skomplikowania, szybkie selecty, dość złożone insert, delete, update
IP Tree - Tutaj implementacja jest łatwiejsza ale też wyszukiwanie nie jest takie trywialne ale i też nie bardzo skomplikowane.
dawid17
26.10.2016, 16:59:53
Przebudowałem bazę danych ale problem nadal pozostał myślę, ze trzeba go rozwiązać z poziomu php może wcześniej zbyt pogmatwałem.
pobieram z bazy pętlą for następującą tablicę asocjacyjną:
Dział 1 - kategoria 1
Dział 1 - kategoria 2
Dział 1 - kategoria 3
Dział 2 - kategoria 1
Dział 2 - kategoria 2
Dział 2 - kategoria 3
Dział 3 - kategoria 1
Dział 3 - kategoria 2
Dział 3 - kategoria 3
Chciałbym aby ten wynik uporządkować (wyświetlić na stronie) w taki sposób:
Dział 1 - kategoria 1
- kategoria 2
- kategoria 3
Dział 2 - kategoria 1
- kategoria 2
- kategoria 3
Dział 3 - kategoria 1
- kategoria 2
- kategoria 3
Chodzi o to żeby w jakiś sposób wpłynąć na iteracje aby tylko raz wzięła pod uwagę dane pole w tabeli (Dział 1, Dział 2, Dział 3)
szydlak
26.10.2016, 23:29:56
Możesz np w ten sposób. Przed pętlą ustawiasz sobie zmienną $biezacy_dzial z nazwą działu pierwszego elementu tablicy. W pętli np for porównujesz od pierwszego elementu tablicy czy dział jest równy ze zmienną $biezacy_dzial (za pomocą if) jeśli tak to wypisujesz podkategorie, a w innym przypadku (else) (czyli jak dojdzie do działu innego) ustawiasz zmienną $biezacy_dział i wypisujesz nową napotkany dział oraz kategorię.
Zakładam że dane są posortowane według działów.
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.