2012-10-20 2 views
4

MySQL에 일부 계층 데이터를 저장합니다. 다양한 이유 때문에 클로저 테이블을 사용하기로 결정했습니다 (중첩 세트, 인접성 목록 등이 아닌). 지금까지는 저에게 큰 도움이되었지만 이제는 HTML로이 트리를 실제로 표시하는 방법을 알아 내려고합니다 (올바른 들여 쓰기로).클로저 테이블에서 HTML로 트리 구조를 표시하는 방법

예를 들어

,

  • 식품
    • 과일
      • 사과
    • 야채 ...의 내가 나무과 같이 있다고 가정 해 봅시다
      • 개 당근



    내 "음식"테이블이 같을 것이다

...
[ID] [PARENT_ID] [NAME] 
1  0    Food 
2  1    Fruits 
3  1    Vegetables 
4  2    Apples 
5  2    Pears 
6  3    Carrots 



내 "폐쇄"표는 다음과 같을 것이다

. ..

[PARENT] [CHILD] [DEPTH] 
1   1   0 
2   2   0 
3   3   0 
4   4   0 
5   5   0 
6   6   0 
1   2   1 
1   3   1 
1   4   2 
1   5   2 
1   6   2 
2   4   1 
2   5   1 
3   6   1 
내가 이상적으로 이런, HTML에서 올바르게 표시 할 수 얼마나 궁금하네요 지금



... 그대로 총알 형태로 내 트리를 표시 할

<ul> 
    <li>Food 
     <ul> 
      <li>Fruits 
       <ul> 
        <li>Apples</li> 
        <li>Pears</li> 
       </ul> 
      </li> 
      <li>Vegetables 
       <ul> 
        <li>Carrots</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

... 내 질문의 시작 부분에. 어쨌든, 어떤 도움을 많이 주시면 감사하겠습니다!

찰스

+0

왜 * Foods 테이블에 상위 ID가 있습니까? 클로우즈 테이블에 이미 부모/자식 관계가 있습니다. – Rafa

답변

2

재귀 함수 호출을 사용할 수 있습니다.

PSEUDCODE (Abstruct) : (상세)

function showTree(parent_id){ 

     // retrive child ids from DB using given parent id 
     result = GetChildren(parent_id); 

     while(...){ 

      child_id = result[...]; 

      // Call this function itself 
      showTree(child_id); 

     } 
} 

PSEUDCODE :

function showTree(parent_id){ 

    /* Retrieve child records which has a relationship with the given parent id.*/ 

    SQL = "SELECT * FROM Foods (WHERE PARENT_ID = " + parent_id + ")"; 
    results = executeSQL(SQL); 

    print "<ul>"; 
    i = 0; 
    while(/*results has record*/){ 
     row = results[i]; 

     print "<li>" + row["NAME"] + "</li>"; 

     /* 
     * Make a recursive call here. 
     * Hand out 'ID' as the parameter. 
     * This 'ID' will be received as 'PARENT_ID' in the function called here. 
     */ 
     call showTree(row["ID"]); 

     i = i +1; 
    } 
    print "</ul>"; 

} 
/* 
* Now start calling the function from top of the nodes. 
*/ 
call showFoods(0); // parameter '0' is the root node. 

내가 도움이되기를 바랍니다.

+0

클로저 테이블에 대해서는 작동하지 않습니다. –