Was ich in früheren Projekten getan habe, wo ich dasselbe tun musste, ich habe zwei neue Spalten hinzugefügt.
- i_depth:int-Wert, wie tief die Kategorie ist
- nvc_breadcrumb:Vollständiger Pfad der Kategorie in einem Breadcrumb-Format
Und dann habe ich der Tabelle, die die Kategorieinformationen enthält, einen Auslöser hinzugefügt, um Folgendes zu tun (alle drei Aktualisierungen befinden sich im selben Auslöser) ...
-- 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
Und dann machen Sie einfach einen Join mit Ihrer Produkttabelle auf der Kategorie-ID und machen Sie ein "LIKE '%/[CATEGORYID]/%' ". Denken Sie daran, dass dies in MS SQL gemacht wurde, aber es sollte einfach genug sein, es in eine MySQL-Version zu übersetzen.
Es ist möglicherweise gerade kompatibel genug für ein Ausschneiden und Einfügen (nach Änderung des Tabellen- und Spaltennamens).
Erweiterung der Erklärung...
t_categories (in der jetzigen Form)...
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 (nach Modifikation)...
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 (nach Verwendung des Skripts, das ich gegeben habe)
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 (wie Sie es jetzt haben, keine Änderungen)...
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
Kategorien und Produkten beitreten (wobei Kategorien C und Produkte P sind)
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
Unter der Annahme, dass die Produkttabelle vollständiger ist, sodass in jeder Kategorie Material vorhanden ist und keine NULL-Werte vorhanden sind, können Sie ein "Breadcrumb LIKE '%/5/%'" ausführen, um die letzten drei Elemente der letzten von mir bereitgestellten Tabelle zu erhalten. Beachten Sie, dass es die direkten Elemente und untergeordneten Elemente der Kategorie enthält (wie den Samsung-Fernseher). Wenn Sie NUR die spezifischen Kategorieartikel möchten, geben Sie einfach ein "c.cat =5" ein.