2010-05-13 9 views
3

Dites que j'ai un tableau de poste contenant les champs post_id et parent_post_id. Je veux retourner chaque enregistrement dans la table de poste avec un compte de la «profondeur» de la poste. Par profondeur, je veux dire, combien de documents parentaux et ancêtres existent.mysql pour obtenir la profondeur d'enregistrement, compter les enregistrements parent et ancêtre

Prenez ces données par exemple ...

post_id parent_post_id 
------- -------------- 
1   null 
2   1 
3   1 
4   2 
5   4 

Les données représente cette hiérarchie ...

1 
|_ 2 
| |_ 4 
|  |_ 5 
|_ 3 

Le résultat de la requête doit être ...

post_id depth 
------- ----- 
1   0 
2   1 
3   1 
4   2 
5   3 

Merci d'avance!

+0

A juste trouvé cet article. Semble que je suis coincé maintenant la profondeur dans une colonne depuis un modèle imbriqué n'est pas approprié: http://stackoverflow.com/questions/1195863/mysql-calculate-depth-in-a-parent-child-model – Nate

Répondre

1

Si vous faites beaucoup de requêtes comme ceci, vous pouvez trouver qu'un modèle de jeu imbriqué est plus approprié que la liste d'adjacence que vous demandez. Il y a une bonne discussion sur les deux modèles here. Dans tous les cas, pour faire ce que vous demandez avec une liste d'adjacence, vous recherchez soit une récursion dans la couche d'application, soit le stockage du niveau comme une 3e colonne.

ETA: si votre compte de niveau n'est pas très élevé, vous pouvez le faire avec auto-jointures:

par exemple nœuds avec 2 ancêtres:

SELECT t1.node 
FROM mytable AS t1 
JOIN mytable AS t2 ON t1.parent = t2.node 
JOIN mytable AS t3 ON t2.parent = t3.node 
WHERE t3.parent IS NULL; 
+0

Mon problème avec ensembles imbriqués est que je vais faire beaucoup d'insertions et je ne veux pas faire des tonnes d'ajustements d'index gauche et droite. J'imagine que tu as raison et je vais juste devoir stocker la profondeur dans une colonne et la maintenir. Bummer. – Nate

+0

@Nate: vérifiez mon ETA. Ce n'est pas trop horrible si la profondeur n'est pas excessive. – dnagirl

Questions connexes