2010-02-23 4 views
3

J'ai un arbre simple qui prend la forme ci-dessousrécursivement traverser simple arbre en PHP

ROOT 
    /\ 
    A B 
/ \ 
    A1  B1 
      \ 
      B11 

Ceci est stocké dans une CLASSES de table DB qui est auto référencement.

ID | CLASS_ID | PARENT_ID 
--------------------------- 
    1 |  ROOT | 
    2 |  A  | ROOT 
    3 |  A1  | A 
    4 |  B  | ROOT 
    5 |  B1  | B 
    6 |  B11 | B1 
--------------------------- 

et ainsi de suite, cela est juste un exemple, le class_id et les colonnes PARENT_ID sont des nombres entiers, mais je les ai juste fait Chars pour cet exemple si vous obtenez l'idée.

Je puis un deuxième enfant de table que je veux ressembler à ceci à la fin,

ID | CLASS_ID | CHILD_CLASS_ID 
-------------------------------- 
    1 |  ROOT | A 
    2 |  ROOT | A1 
    3 |  ROOT | B 
    4 |  ROOT | B1 
    5 |  ROOT | B11 
    6 |  A  | A1 
    7 |  B  | B1 
    8 |  B  | B11 
    9 |  B1  | B11 
--------------------------- 

Donc, essentiellement, si une classe est inférieure à une classe dans sa branche, il est un enfant de toutes les classes supérieures . Je sais que c'est vraiment un problème de récursivité, mais je suis nouveau à PHP pourrait vraiment utiliser de l'aide. Je cours mysql. Je devrais également mentionner que je vais traverser en arrière. Donc j'insère des cours en bas. Un exemple serait la prochaine classe à insérer serait A11, je aurais alors besoin de parcourir jusqu'à trouver toutes les classes supérieures et les rendre les classes parentes de A11.

+0

La question est comment itérer un resultset multidimensionnel ou comment obtenir le resultset en premier lieu? – Gordon

+0

Eh bien, je voudrais être en mesure d'obtenir le jeu de résultats, mais si je peux itérer au point où j'arrive à chaque parent ID puis je peux faire un insert sur la table des enfants. Alors soit travaillerait pour moi. – medium

+0

Cela ressemble à une tâche de devoirs. * tsk * – Sherri

Répondre

2

Je espère avoir compris ce que vous essayez de faire. Devez-vous travailler en arrière pour créer la table des enfants?

Si vous travaillez de haut en bas, vous pouvez rassembler tous les ID d'enfant pour chaque parent à l'aide d'un MySQL GROUP_CONCAT()

SELECT PARENT_ID, GROUP_CONCAT(CLASS_ID) AS CHILDREN 
FROM CLASSES 
GROUP BY PARENT_ID 

Cela devrait retourner quelque chose comme:

| PARENT_ID | CHILDREN  | 
----------------------------- 
| ROOT  | A,A1,B,B1,B11 | 
| A   | A1   | 
| B   | B1,B11  | 
| A1  |    | 
| B1  | B11   | 
| B11  |    | 
----------------------------- 

Ensuite, vous pouvez briser que jusqu'à et peupler votre table ENFANTS?

0

Faut-il le faire? C'est un mauvais moyen à mon avis. Vos requêtes deviennent complexes, où comme si vous utilisiez une Liste d'adjacence, c'est simple.

Jetez un coup d'oeil à ceci.

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

+0

J'ai mal inséré ensemble imbriqué à la place de la liste d'ajacency, donc je l'ai édité. – Layke

+0

Sa première table est une liste d'adjacence (c'est-à-dire celle avec la relation récursive). Il devrait regarder les ensembles imbriqués (ou combiner les deux). Lorsque vous utilisez une solution ORM PHP comme Propel ou Doctrine, travailler avec des ensembles imbriqués est très facile. Mais le lien que vous avez fourni ci-dessus est en effet un must, il va clarifier beaucoup de choses. – wimvds