2010-06-29 7 views
3

Je voudrais savoir s'il est possible d'extraire les catégories et sous-catégories dans un seul fetch DB.Comment récupérer des catégories et sous-catégories dans une seule requête en SQL? (mysql)

Ma table de DB est quelque chose de similaire à celui indiqué ci-dessous

Table

cat_id parent_id 
1  0 
2  1 
3  2 
4  3 
5  3 
6  1 

-à-dire lorsque l'entrée est 3, puis toutes les lignes avec parent_id que 3 et la ligne 3 elle-même et tous les parents de la rangée 3 doit être récupérée.

sortie

cat_id parent_id 
3  2 -> The row 3 itself 
4  3 -> Row with parent as 3 
5  3 -> Row with parent as 3 
2  1 -> 2 is the parent of row 3 
1  0 -> 1 is the parent of row 2 

peut-il être fait en utilisant des procédures stockées et des boucles? Si oui, sera-t-il un seul fetch DB ou multiple? Ou y a-t-il d'autres meilleures méthodes?

Merci !!!

+1

Voici quelques lectures: http://dev.mysql.com/tech-resources/articles/hierarchical-data.html Dans MySQL, il est un sujet difficile ... Merci –

+0

compagnon. Bel article en effet! Alors, le mien suit le modèle adjacent !? Hmm ... Mais puisque le niveau peut varier (des entrées dynamiques peuvent être faites dans la table), je ne suis toujours pas sûr de la façon de l'implémenter. Toujours en train de penser .... – user355562

+0

Toujours coincé après 2 jours! :(Pas satisfait des résultats !!! – user355562

Répondre

1

Si vous posez des questions sur "Existe-t-il des requêtes récursives mysql?" répondez "NON".

Mais il y a une très bonne approche pour le gérer.

Créer table d'assistance (en disant CatHierarchy)

CatHierarchy: 
    SuperId, ChildId, Distance 
------------------------------ 
    1   1   0 
    1   2   1 
    2   2   0 

Ces données redondantes permet facilement dans une requête pour sélectionner une hiérarchie, et dans 2 Plaque d'insertion toute hiérarchie (suppression également effectuée dans une requête avec l'aide de la suppression en cascade intégrité).

Alors qu'est-ce que cela signifie. Vous suivez tous les chemins dans la hiérarchie. Chaque nœud de Cat doit ajouter une référence à lui-même (distance 0), puis prendre en charge la duplication en ajoutant des données redondantes sur les nœuds liés.

Pour sélectionner la catégorie avec des sous il suffit d'écrire:

SELECT c.* from Category c inner join CatHierarchy ch ON ch.ChildId=c.cat_id 
     WHERE ch.SuperId = :someSpecifiedRootOfCat 

someSpecifiedRootOfCat - est paramètre pour spécifier la racine de la catégorie est TOUT!

-1

Il est délicat. Je suppose que vous voulez afficher les catégories, un peu comme une vue de dossier? Trois champs: MainID, ParentID, Name ... Appliquez à votre table, et cela devrait fonctionner comme un charme. Je pense que c'est ce qu'on appelle une requête récursive?

WITH CATEGORYVIEW (catid, parentid, categoryname) AS 
(
SELECT catid, ParentID, cast(categoryname as varchar(255)) 
    FROM [CATEGORIES] 
WHERE isnull(ParentID,0) = 0 

UNION ALL 

SELECT C.catid, C.ParentID, cast(CATEGORYVIEW.categoryname+'/'+C.categoryname as varchar(255)) 
    FROM [CATEGORIES] C 
    JOIN CATEGORYVIEW ON CATEGORYVIEW.catID = C.ParentID 
) 
SELECT * FROM CATEGORYVIEW ORDER BY CATEGORYNAME 
Questions connexes