2010-03-31 4 views
0

J'utilise un ensemble imbriqué dans une table MySQL pour décrire une hiérarchie de catégories, et un tableau supplémentaire décrivant les produits.Hiérarchie des ensembles imbriqués MySQL avec table étrangère

Tableau de catégorie;

id 
name 
left 
right 

Tableau des produits;

id 
categoryId 
name 

Comment puis-je récupérer le chemin d'accès complet, contenant toutes les catégories parentes, d'un produit? I.e. .:

RootCategory > SubCategory 1 > SubCategory 2 > ... > SubCategory n > Product

Dites par exemple que je veux à la liste tous les produits de SubCategory1 et il est sous-catégories, et chaque donnée Product Je veux que le chemin d'arbre complet pour ce produit - est-ce possible?

Ceci est aussi loin que j'ai - mais la structure n'est pas tout à fait raison ...

select 
parent.`name` as name, 
parent.`id` as id, 
group_concat(parent.`name` separator '/') as path 
from 
categories as node, 
categories as parent, 
(select 
    inode.`id` as id, 
    inode.`name` as name 
from 
    categories as inode, 
    categories as iparent 
where 
    inode.`lft` between iparent.`lft` and iparent.`rgt` 
    and 
    iparent.`id`=4 /* The category from which to list products */ 
order by 
    inode.`lft`) as sub 
where 
node.`lft` between parent.`lft` and parent.`rgt` 
and 
node.`id`=sub.`id` 
group by 
sub.`id` 
order by 
node.`lft` 

Répondre

0

Hé, je pense que je l'ai résolu! : D

select 
    sub.`name` as product, 
    group_concat(parent.`name` separator ' > ') as name 
from 
    categories as parent, 
    categories as node, 
    (select 
     p.`name` as name, 
     p.`categoryId` as category 
    from 
     categories as node, 
     categories as parent, 
     products as p 
    where 
     parent.`id`=4 /* The category from which to list products */ 
     and 
     node.`lft` between parent.`lft` and parent.`rgt` 
     and 
     p.`categoryId`=node.`id`) as sub 
where 
    node.`lft` between parent.`lft` and parent.`rgt` 
    and 
    node.`id`=sub.`category` 
group by 
    sub.`category` 
+0

Dans la question, vous ne mentionnez pas que les ID de nœud sont affectés dans un ordre qui vous permet de le faire. Sans cette connaissance, je ne pense pas que cela puisse être fait. – reinierpost

0

Pour récupérer les parents nœuds vous avez seulement besoin ... left/right valeurs de dernier (Sous-catégorie n).

  1. Récupérez votre produit: SELECT ... FROM product p JOIN category c ON c.id = p.category_id WHERE p.id = ?.
  2. Fetch parents: SELECT ... FROM category WHERE leftCol <= {productCategory['left']} AND rightCol >= {productCategory['right']}

C'est assez tout ce dont vous avez besoin.

+0

Merci, pas tout à fait sûr de la façon dont vous voulez dire - je voulais cela en une seule requête. Merci pour votre contribution - vous êtes invités à élaborer votre réponse plus loin! –

Questions connexes