Wat ik heb gedaan in eerdere projecten waar ik hetzelfde moest doen, ik heb twee nieuwe kolommen toegevoegd.
- i_depth:int waarde van hoe diep de categorie is
- nvc_breadcrumb:volledig pad van de categorie in een breadcrumb-formaat
En toen heb ik een trigger aan de tabel toegevoegd die de categorie-informatie bevat om het volgende te doen (alle drie updates bevinden zich in dezelfde trigger)...
-- Reset all branches
UPDATE t_org_branches
SET nvc_breadcrumb = NULL,
i_depth = NULL
-- Update the root branches first
UPDATE t_org_branches
SET nvc_breadcrumb = '/',
i_depth = 0
WHERE guid_branch_parent_id IS NULL
-- Update the child branches on a loop
WHILE EXISTS (SELECT * FROM t_branches WHERE i_depth IS NULL)
UPDATE tobA
SET tobA.i_depth = tobB.i_depth + 1,
tobA.nvc_breadcrumb = tobB.nvc_breadcrumb + Ltrim(tobA.guid_branch_parent_id) + '/'
FROM t_org_branches AS tobA
INNER JOIN t_org_branches AS tobB ON (tobA.guid_branch_parent_id = tobB.guid_branch_id)
WHERE tobB.i_depth >= 0
AND tobB.nvc_breadcrumb IS NOT NULL
AND tobA.i_depth IS NULL
En doe dan gewoon een join met je producttabel op de categorie-ID en doe een "LIKE '%/[CATEGORYID]/%' ". Houd er rekening mee dat dit in MS SQL is gedaan, maar het zou gemakkelijk genoeg moeten zijn om te vertalen naar een MySQL-versie.
Het is misschien net compatibel genoeg voor knippen en plakken (na wijziging van de tabel- en kolomnaam).
Uitbreiding uitleg...
t_categories (zoals het er nu uitziet)...
Cat Parent CategoryName
1 NULL MyStore
2 1 Electronics
3 1 Clothing
4 1 Books
5 2 Televisions
6 2 Stereos
7 5 Plasma
8 5 LCD
t_categories (na wijziging)...
Cat Parent CategoryName Depth Breadcrumb
1 NULL MyStore NULL NULL
2 1 Electronics NULL NULL
3 1 Clothing NULL NULL
4 1 Books NULL NULL
5 2 Televisions NULL NULL
6 2 Stereos NULL NULL
7 5 Plasma NULL NULL
8 5 LCD NULL NULL
t_categories (na gebruik van het script dat ik gaf)
Cat Parent CategoryName Depth Breadcrumb
1 NULL MyStore 0 /
2 1 Electronics 1 /1/
3 1 Clothing 1 /1/
4 1 Books 1 /1/
5 2 Televisions 2 /1/2/
6 2 Stereos 2 /1/2/
7 5 LCD 3 /1/2/5/
8 7 Samsung 4 /1/2/5/7/
t_products (zoals je het nu hebt, geen aanpassingen)...
ID Cat Name
1 8 Samsung LNT5271F
2 7 LCD TV mount, up to 36"
3 7 LCD TV mount, up to 52"
4 5 HDMI Cable, 6ft
Word lid van categorieën en producten (waarbij categorieën C is, producten P)
C.Cat Parent CategoryName Depth Breadcrumb ID p.Cat Name
1 NULL MyStore 0 / NULL NULL NULL
2 1 Electronics 1 /1/ NULL NULL NULL
3 1 Clothing 1 /1/ NULL NULL NULL
4 1 Books 1 /1/ NULL NULL NULL
5 2 Televisions 2 /1/2/ 4 5 HDMI Cable, 6ft
6 2 Stereos 2 /1/2/ NULL NULL NULL
7 5 LCD 3 /1/2/5/ 2 7 LCD TV mount, up to 36"
7 5 LCD 3 /1/2/5/ 3 7 LCD TV mount, up to 52"
8 7 Samsung 4 /1/2/5/7/ 1 8 Samsung LNT5271F
Ervan uitgaande dat de producttabel completer was, zodat er dingen in elke categorie zijn en geen NULL's, zou je een "Breadcrumb LIKE '%/5/%'" kunnen doen om de laatste drie items van de laatste tabel die ik heb verstrekt te krijgen. Merk op dat het de directe items en onderliggende items van de categorie bevat (zoals de Samsung-tv). Als je ALLEEN de specifieke categorie-items wilt, doe dan gewoon een "c.cat =5".