2009-10-28 4 views
2

Mon premier post ici! J'ai l'impression que c'est le bon endroit pour être sage;)Problème MPTT (Modified Preorder Tree Traversal) en PHP

Je suis actuellement au milieu de quelques tests avec ma première tentative d'essayer l'approche MPTT (Modified Preorder Tree Traversal) pour stocker des données dans ma base de données Mysql avec l'aide de PHP.

Cependant, j'essaie de trouver la manière la plus axée sur les performances pour obtenir tous les éléments de la liste sur un niveau spécifique, avec un parent spécifique.

Cela pourrait se traduire par l'obtention des catégories Saab et Chrysler de l'image ci-dessous, si le parent entré serait nommé "Bilar". (Ce qui signifie Voitures en suédois, si ce isnt votre côté le plus fort;))

Comme je ne peux pas publier des images, voici un lien vers l'organigramme: http://www.phpsidan.nu/files/mptt/mptt1.png

Actuellement je fais deux querys pour faire ce Je veux, et assez de code pour calculer le niveau et cracher tous les autres éléments au même niveau.

Existe-t-il un meilleur moyen de le faire et en espérant que d'utiliser une seule requête?

Merci beaucoup!

Répondre

1

Je suis sûr que cela pourrait être optimisé, mais en supposant que vous avez les colonnes "nom", "lft" et "rgt", ce qui suit vous donnera les frères et sœurs de niveau 2 de "Bilar".

SELECT node.name,                                  
     node.lft AS sort,                                                                
     (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth                   

FROM car AS node,                                 
    car AS parent,                                 
      car AS sub_parent,                                
      (SELECT node.name, (COUNT(parent.name) - 1) AS depth                       
       FROM car AS node,                               
         car AS parent                               
       WHERE node.lft BETWEEN parent.lft AND parent.rgt                        
        AND node.name = "Bilar"                              
      GROUP BY node.name                                
      ORDER BY node.lft) AS sub_tree 

WHERE node.lft BETWEEN parent.lft AND parent.rgt                          
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt                        
    AND sub_parent.name = sub_tree.name 

GROUP BY node.name HAVING depth <= 2                             
ORDER BY node.lft 
0

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ a des infos et des exemples de requêtes sur des ensembles imbriqués

obtenir les enfants immédiats en Nouvelle-Écosse est compliquée, certaines personnes préfèrent donc stocker parent_id explicite avec « gauche » et pointeurs « droit ».

+0

Salut Stereofrog, Merci pour votre temps. C'est bien sûr une option, mais prend un peu de la bonne partie de MPTT loin. Y a-t-il quelqu'un d'autre qui a de l'expérience dans ce type de catégorisation/tri des éléments? Merci! – Industrial