2017-07-01 2 views
1

C'est une table de catégorie,Comment puis-je obtenir toutes les sous-catégories liées à une catégorie sans savoir à quelle profondeur il va.

CREATE TABLE `categories` (
    `id` int(11) NOT NULL, 
    `name` varchar(50) DEFAULT NULL, 
    `parentid` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Voici comment vous obtenez Catégorie et sous-catégorie connexe.

SELECT root.name AS root_name 
    , down1.name AS down1_name 
    , down2.name AS down2_name 
    FROM categories AS root 
LEFT OUTER 
    JOIN categories AS down1 
    ON down1.parentid = root.id 
LEFT OUTER 
    JOIN categories AS down2 
    ON down2.parentid = down1.id 

WHERE root.parentid IS NULL 
ORDER 
    BY root_name 
    , down1_name 
    , down2_name 

SQLfiddle

Ce que je constate est que cette requête va seulement 2 pas/nœuds avant, comme dire

category > sub-category 1 > sub-category 2 

Et si j'ai une sous-catégorie qui va au-delà de 2 étape/nœuds comme dire

category > sub-category 1 > sub-category 2 > sub-category 3 

ou même peut être sous-catégorie 4 dois-je ajouter down3.nam e ou down4.name pour arriver à la fin pour inclure toutes les sous-catégories ou existe-t-il un meilleur moyen?

+0

Vous ne pouvez pas vraiment en MySQL. Vous avez deux choix: modifier la représentation de la hiérarchie ou utiliser une procédure stockée récursive. –

+0

Copie possible de [Comment créer une requête récursive hiérarchique MySQL] (https://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query) – krokodilko

Répondre

0

Vous pouvez obtenir la hiérarchie complète d'un élément à l'aide d'une requête récursive.

ex:

select c.id,c.name,@parent := c.parentid 
from 
(select * from categories order by id desc) c 
join 
(select @parent := 16) t 
where c.id [email protected] 

créer une procédure stockée pour obtenir la sortie souhaitée pour tout objet ids récursive.