2017-05-10 4 views
1

J'ai une table comme celui-cicomment sélectionner racine de feuilles dans le tableau simple mysql

id , parent_id , name  , leaf 
1 , 0   ,parent 1 , 0 
2 , 0   ,parent 2 , 0 
3 , 1   ,child 1 , 0 
4 , 3   ,child 2 , 1 
5 , 2   ,child 3 , 0 
6 , 5   ,child 4 , 1 
7 , 0   ,child 5 , 1 

Et je veux sélectionner les feuilles et il s `nom de racine ne nom parent Quelque chose comme ci-dessous

id , name  , root_name 
4 , child 2 , parent 1 
6 , child 4 , parent 2 
7 , child 5 , null 

Trois peuvent avoir plusieurs niveaux Comment puis-je le faire juste en MySQL avec procédure stockée?

+0

Vous avez observé que MySQL a actuellement aucun support pour récursivité. Les choix incluent l'écriture d'un sproc, la gestion de la logique dans le code de l'application, l'assemblage de la table à lui-même aussi souvent que nécessaire, ou le passage à un autre modèle, par ex. ensembles imbriqués. Tous ces sujets sont largement discutés ailleurs, je ne vais donc pas les développer ici. – Strawberry

Répondre

0

IMO vous devriez avoir deux tables pour cela. Un pour les nœuds et un pour la relation des nœuds. Ensuite, vous pouvez faire une jointure et obtenir les résultats que vous voulez.

Lisez à propos de Database normalization et pourquoi c'est important, vous pourriez normaliser votre DB jusqu'à la 3e forme normale.

nodes (
    id, 
    name 
) 

node_to_parent (
    id 
    node_id, 
    parent_id 
) 

Ensuite, vous pouvez interroger comme ceci:

Select n.name, np.parent_id from nodes 
join node_to_parent np 
on np.node_id = n.node_id; 
+0

merci de répondre. comment puis-je sélectionner simplement root_node de feuilles avec procédure stockée? –

1

Vous pouvez faire quelque chose comme ci-dessous pour obtenir puissance nécessaire

select t.id, t.name, m.root_name from (select id,parent_id,name,leaf from urtable where leaf=1) t 
join urtable m on (t.parent_id=m.parent_id and t.id=m.id)