2010-08-31 19 views
0

J'ai une table de catégories configurée comme so [id, name, parent_id] et une table d'éléments [id, name, category_id, visible]. Ce que j'essaye de faire est de créer une requête qui retournera tous les identifiants de toutes les catégories non vides, non vide étant que lui ou l'un de ses enfants a au moins un élément qui lui appartient. Quel serait le meilleur moyen de le faire dans MySQL?Recherche de toutes les catégories non vides dans un arbre

modifier

SELECT category_id DISTINCT Articles

Cela fonctionne pour les catégories contenant des articles, mais je dois aussi les catégories de parents de tous les élément contenant catégories. Cette requête sera utilisée comme sous-requête avec d'autres filtres.

Haut Niveau Catégorie

-> Deuxième niveau Catégorie

-> Troisième niveau Catégorie

---> Article 1

---> Article 2

Répondre

1

Toutes les catégories non vides, et seulement celles-ci, ont des éléments avec category_id pointant sur eux, donc vous pouvez simplement sélectionner category_id s à partir des éléments ta BLE:

SELECT DISTINCT category_id FROM Items 

Pour autant que je sache, vous ne pouvez pas sélectionner tous les ancêtres de ces catégories dans une requête, mais vous pouvez utiliser un autre modèle d'arbre.

Avec le nested set model, votre requête pourrait ressembler à ceci:

SELECT DISTINCT c.id FROM Categories c JOIN Items ON c.id = category_id JOIN Categories ancestors ON c.lft BETWEEN ancestors.lft AND ancestors.rgt 

Je ne sais pas si ça va marcher, mais vous pouvez essayer.

+0

Le vrai problème est une requête récursive. Votre réponse ne renvoie pas les catégories dont les sous-catégories contiennent des éléments. – bbadour

+0

Oh, vous avez raison. Cependant, tout en retournant leurs parents pourrait être fait, renvoyer tous les ancêtres n'est pas faisable avec une requête. – Mewp

+0

J'ai mis à jour ma réponse, en suggérant une autre méthode. – Mewp