2011-10-05 4 views
3

J'ai des données hiérarchisées ordonnées sauvegardées à l'aide de l'algorithme modifié de traversée d'arbre de précommande.Traversée de l'arborescence de précommande modifiée: Sélection des nœuds 1 niveau de profondeur

est ici le contenu de tables:

id lft rgt name 
1 1 10 topnode 
2 2 3 level1 
3 4 7 level1 
4 5 6 level2 
5 8 9 level1 

Visualisé:

Scheme

Ce que je veux est de sélectionner seulement les childNodes d'un certain noeud (donc pas les childNodes des childNodes). Disons "topnode". J'essaie de résoudre une requête, mais je n'arrive pas à la comprendre.

La recherche sur Internet m'amène un peu de temps, par exemple: je peux calculer la profondeur de chaque nœud, mais je n'arrive pas à le sélectionner.

Cette requête

SELECT node.*, (COUNT(parent.id) - 1) AS depth 
FROM tree AS node 
CROSS JOIN tree AS parent 
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) 
GROUP BY node.id 
ORDER BY node.lft 

montre la profondeur de chaque noeud:

id lft rgt name  depth 
1 1 10 topnode 0 
2 2 3 level1 1 
3 4 7 level1 1 
4 5 6 level2 2 
5 8 9 level1 1 

C'est super, mais je ne peux pas utiliser la profondeur de la colonne comme condition!

Répondre

9

Je pense que cela devrait faire l'affaire

SELECT node.*, (COUNT(parent.id) - 1) AS depth 
FROM tree AS node 
CROSS JOIN tree AS parent 
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) 
GROUP BY node.id 
HAVING depth = {{ENTER YOUR REQUIRED DEPTH HERE}} 
ORDER BY node.lft 

espoir qui aide

+3

+1 parce que cela fonctionne, mais il est vraiment lent avec mon arbre-noeuds (35000 8 secondes). Je ne peux pas l'utiliser :( – Ivan

Questions connexes