Ce que j'ai fait dans des projets précédents où j'avais besoin de faire la même chose, j'ai ajouté deux nouvelles colonnes.
- i_depth :valeur int de la profondeur de la catégorie
- nvc_breadcrumb :chemin complet de la catégorie dans un format de type fil d'Ariane
Et puis j'ai ajouté un déclencheur au tableau qui contient les informations de catégorie pour faire ce qui suit (les trois mises à jour sont dans le même déclencheur)...
-- 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
Et puis faites simplement une jointure avec votre table de produits sur l'ID de catégorie et faites un "LIKE '%/[CATEGORYID]/%'". Gardez à l'esprit que cela a été fait dans MS SQL, mais cela devrait être assez facile à traduire dans une version MySQL.
Il pourrait juste être assez compatible pour un copier-coller (après le changement de nom de table et de colonne).
Élargissement de l'explication...
t_categories (telles qu'elles sont actuellement)...
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 (après modification)...
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 (après utilisation du script que j'ai donné)
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 (comme vous l'avez maintenant, pas de modifications)...
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
Joindre des catégories et des produits (où catégories est C, produits est 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
Maintenant, en supposant que la table des produits était plus complète pour qu'il y ait des choses dans chaque catégorie et pas de NULL, vous pourriez faire un "Breadcrumb LIKE '%/5/%'" pour obtenir les trois derniers éléments de la dernière table que j'ai fournie. Notez qu'il inclut les éléments directs et les enfants de la catégorie (comme le téléviseur Samsung). Si vous voulez UNIQUEMENT les éléments de la catégorie spécifique, faites simplement un "c.cat =5".