2012-09-25 2 views
2

내 용어가 다소 부족하기 때문에 제 질문의 제목은 절름발이입니다.하지만 아래에서 의미하는 바를 설명하겠습니다. 이제DB에서 여러 수준의 하위 항목 가져 오기?

categories: 

category_id | parent_id 

    0   0 
    1   0 
    2   1 
    3   1 
    4   3 

, 제가하고 싶은 것은 출력이 같은 범주 구조입니다 :

category structure: 

0 
1 -> 2 
    3 -> 4 

또한에 필요에

는 나는 다음과 같은 일을 보이는 MySQL의 테이블이 카테고리 구조를 표시 할 수 있어야합니다. 카테고리가 선택되면 해당 카테고리의 모든 기사와 하위 카테고리에서 기사를 찾고 싶습니다 (각 기사는 각 기사가 해당 카테고리에 해당하는 parent_category_id를 갖게됩니다) . 나는이 일을 생각할 수

유일한 방법은 다음과 같습니다

  1. 이 결과를 반복 단계의 모든 통해
  2. 루프를보고있는 범주의 ID와 동일한 PARENT_ID 모든 범주를 받기 하나
  3. 모든 결과가 확인 될 때까지 계속 수행하십시오.

더 좋은 방법이 있습니까?

답변

1

효과적인 방법으로이를 수행하는 한 가지 방법은 중첩 된 세트를 사용하는 것입니다. 조금 까다 롭고 업데이트하기가 다소 복잡합니다.

다음과 같이 작동합니다.

모든 노드는 2 개의 ID와 레벨을가집니다. 모든 자식 노드 ID는 노드 ID 사이에 있습니다. 예 :

category_id | parent_id | low_id | high_id 
0   0   1   2 
1   0   3   10 
2   1   4   5 
3   1   6   9 
4   3   7   8 

지금 당신이 "나에게 모든 카테고리의 자식 노드를 제공"말할 수있다 : 당신이 노드를 삽입해야하는 경우

select * 
from categories 
where low_id between 3 /* (low_id node1) */ and 10 /* (high_id node 1) */ 

하지만, 당신은 다른 노드를 이동하는 알고리즘을 필요로 오른쪽 위치에. 또한 노드의 레벨을 저장하는 것이 좋으므로 id/parent_id 관계를 찾을 필요가 없으므로 low_id로 정렬하고 표시기로 레벨을 사용하기 만하면됩니다.

프로그래밍 언어로 PHP를 사용하는 경우 중첩 세트를 처리하는 doctrine2 플러그인이 있습니다.

편집 : 시작하기에 좋은 시점이라고 생각합니다. http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

관련 문제