2010-12-10 4 views
0

j'ai données de la table comme celui-cisql pour obtenir le dernier noeud de la table de base de la hiérarchie?

id = 1, parent = 0 
id = 2, parent = 1 
id = 3, parent = 1 
id = 4, parent = 1 

id = 5, parent = 0 
id = 6, parent = 5 
id = 7, parent = 5 
id = 8, parent = 5 

id = 9, parent = 0 

maintenant je veux obtenir un résultat comme celui-ci, seul le dernier nœud de l'arbre comment puis-je faire cela?

id = 4, parent = 1 
id = 8, parent = 5 
id =9, parent = 0 

EDIT 1: Que se passe-t-il si je mets le parent id_id = id? Cela voudrait dire que je pourrais regrouper par parent ID. Je suis juste inquiet que cela causera des problèmes dans le futur quand j'ai besoin d'obtenir le nœud racine (ce qui signifie que je ne ferai plus de requête pour WHERE parent_id = 0, je devrais faire WHERE id = parent_id)

+0

MySQL n'a pas de fonctions hiérarchiques –

+0

oui mais je devrais être capable d'obtenir des résultats en utilisant sql normal, sans utiliser de fonctions hiérarchiques non? – Aman

Répondre

0

si l'on suppose que les noeuds avec ids supérieurs sont « plus tard », alors il est juste:

select max(id), parent from tree group by parent; 

Quant au nœud racine, sûrement que devrait être inséré d'abord, et aurait donc un identifiant connu tel que 1 ou 0 , ou pourrait avoir un identifiant parent spécial tel que NULL ou -1.

+0

Ouais thanx ça me donne un résultat correct 4,8,9. Mais si les données changent un peu, disons que je n'ai que des données comme id 1, 2, 3, 4 comme dans l'exemple ci-dessus. Cela me montre 1 et 4 tous les deux. Cela aurait dû me montrer 4 seulement? Qu'est-ce que je dois ajuster à ce sql? – Aman

+0

1 est l'enfant le plus récemment ajouté de zéro, et 4 si l'enfant le plus récent de 1, c'est correct, n'est-ce pas? – Martin

+0

int ce que j'ai fait a été fait parent = id pas plus de zéro (0) pour le parent, exemple: si nouvelle ligne est id = 1 alors parent = 1 ainsi et votre sql a donné ce que je cherchais .. merci beaucoup – Aman