2009-10-28 4 views
2

내 첫 게시물을 여기에!)PHP의 MPTT (Preorder Tree Traversal 수정) 문제

나는 MPTT (Modified Preorder Tree Traversal) 접근 방식을 사용해 MySQL 데이터베이스에 데이터를 저장하려고 시도한 첫 번째 시도에서 현재 테스트 중에있다. PHP의.

그러나 특정 상위의 특정 수준에서 모든 목록 요소를 가져 오는 성능 지향적 인 방법을 찾으려고합니다.

입력 한 학부모의 이름이 "Bilar"인 경우 이는 아래 이미지에서 Saab 및 Chrysler 카테고리를 얻는 것으로 해석 될 수 있습니다. http://www.phpsidan.nu/files/mptt/mptt1.png

은 현재 내가 무엇을 할 수있는 두 개의 querys을하고있다 : 나는 이미지를 게시하지 못할 때, 여기 흐름도를 링크의

) (즉, 가장 강한면을 밤은 경우 어느, 스웨덴어로 자동차를 의미) 내가 원하는, 그리고 코드의 상당량은 레벨을 계산하고 같은 수준에있는 다른 모든 요소를 ​​뱉어.

이 작업을 수행하고 하나의 쿼리 만 사용하여 더 좋은 방법이 있습니까?

고맙습니다.

답변

1

"name", "lft"및 "rgt"열이 있다고 가정하면 최적화 할 수 있다고 확신하지만 다음은 "Bilar"의 레벨 2 형제를 제공합니다.

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/ 그러므로 어떤 사람들은 "왼쪽"과 "오른쪽"포인터와 함께 명시 PARENT_ID를 저장하는 것을 선호, 중첩 된 세트

NS에서 즉시 아이를 점점 복잡에 대한 정보를 정기적으로 쿼리 예제를 가지고있다.

+0

안녕하십니까, Stereofrog, 시간 내 주셔서 감사합니다. 그것은 당연한 선택이지만 MPTT의 좋은 부분을 조금 벗어났습니다. 이 유형의 요소 분류/분류에 경험이있는 사람이 있습니까? 감사! – Industrial