DOEL: een hiërarchie van categorieën weergeven zoals hieronder. echter alleen categorieën die aan een conditie voldoen (bevat item van gebruiker). ![]() | TABELLEN MYSQL:![]() |
INGREDIENTEN:
Als uitgangspositie geldt de user_id (in dit voorbeeld 'johan').
1. 'user' Johan heeft 'items' 1,2,3,4,5 en 6.
2. in tabel 2 zie je dat deze items aan verschillende categorieën zijn verbonden (30,42,45,48,50).
3. in tabel 3 zie je dat elke categorie een 'parent_id' heeft, parent '0' betekent dat het de root categorie is.
4. wanneer een (root/parent)categorie een subcategorie bevat, bevat het geen items. bij subcategorieën is een ongelimiteerde diepte mogelijk, het kan dus ook een level 5 subsubsubsubsub zijn.
PROBLEEM / VRAAG
Hoe krijg ik een categoriehiërarchie voor de pagina van 'johan', dus alleen van die categorieën waarin zich items van 'johan' bevinden?
Dit lukt me maar niet. geen probleem om een de hiërarchie van ALLE categorieën op te zetten, maar in mijn hoofd 'zie' ik gewoon niet waar ik de gebruiker (johan) als conditie aan moet geven (lijkt mij als eerste) of hoe ik de uitkomst kan 'samenvoegen' tot 1 categoriestructuur ipv allemaal losse categoriepaden per item (zie voorbeeld hieronder).
Er klopt dus iets niet in mijn denkwijze; er moet van achter naar voren gewerkt worden bij het ophalen lijkt me (gebruiker => subsub => sub => parent) om vervolgens de categorieën van voren naar achter weer te geven (parent => sub => subsub).
Wie kan me helpen om hiervoor een goed weg te vinden of om het licht te zien? wat o wat doe of denk ik fout? mijn dank alvast voor een ieder die zich hierover zou willen buigen..
een van de voorbeelden van hoe het mij vooral NIET lukt (uiteindelijk moet de uitkomst in een <li>structuur komen, maar dat laten we hier even weg):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| function getCatHierarchy($parentCat) { $rval = ""; $res2 = mysql_query("SELECT * FROM categorieen WHERE cat_id='".$parentCat."'"); while ( $row2 = mysql_fetch_array($res2) ) { $rval = " > ".$row2["cat_naam"].$rval; $parentCat = $row2["parent_id"]; mysql_free_result($res2); $res2 = mysql_query("SELECT * FROM categorieen WHERE cat_id=".$parentCat." ORDER BY TITLE"); } mysql_free_result($res2); $rval = substr($rval, 2); return ($rval); } $res = mysql_query("SELECT DISTINCT I.cat_id AS CID FROM user U, items I WHERE U.user_id = 'johan' AND I.item_id = U.item_id ORDER BY I.cat_id"); $array = array(); while($row = mysql_fetch_assoc($res)){ $array[] = $row['CID']; } foreach ($array as $cat) { echo getCatHierarchy($cat); } |
Dit resulteert in een categoriepad per item:
rootcat(10) > subcat(20) > subsubcat(30)
rootcat(10) > subcat(20) > subsubcat(30)
rootcat(10) > subcat(20) > subsubcat(42)
rootcat(12) > subcat(37) > subsubcat(45)
rootcat(12) > subcat(37) > subsubcat(48)
rootcat(10) > subcat(21) > subsubcat(50)
terwijl het samengevoegd zou moeten zijn, zoiets als:
rootcat(10) > subcat(20) > subsubcat(30)
................................... > subsubcat(42)
................ > subcat(21) > subsubcat(50)
rootcat(12) > subcat(37) > subsubcat(45)
................................... > subsubcat(48)