2011-05-16 3 views
0

나는 다음과 같은 테이블이 있습니다계층 데이터가 같은 테이블에 부모/자식 관계의 가입

Id ParentId Weight 
1 1   0 
2 1   10 
3 2   5 

ParentId 참조 같은 테이블의 Id을. 이 테이블을 쿼리하여 세 번째 열의 누적 가중치를 합산하여 어떻게 자체적으로이 테이블에 연결할 수 있습니까?

예를 들어, Id 2의 누적 가중치를 알고 싶다면 결과는 항목 3의 부모가 2이므로 결과는 15 (Id2 + Id3 = 15)를 반환합니다. 항목의 누적 가중치를 알고 싶었 으면 3이면 항목 3의 상위 ID를 가진 레코드가 없으므로 5를 반환합니다.

기본적으로 쿼리하는 레코드에 자식이 있으면 데이터 자식 시퀀스를 추가하고 하나의 결과를 반환하려고합니다.

이 작업은 데이터베이스에서 수행 할 수 있습니까? 아니면 일치하는 레코드를 찾기 위해 전체 레코드를 반복해야합니까?

답변

1

this article을 살펴보십시오. 테이블을 자주 업데이트하지 않으면 모든 행에 대한 모든 경로를 생성하는 GenericTree 프로 시저를 약간 수정할 수 있습니다 (레코드를 테이블에 삽입하거나 ParentId 열을 업데이트 할 때마다 호출 함).이 데이터를 새 테이블에 저장하고, 간단한 쿼리를 사용하여 필요한 모든 작업을 수행 할 수 있습니다. 개인적으로, 나는 다음과 같은 테이블 구조와 끝까지 :

CREATE TABLE `tree_for_my_table` (
`rootID` INT(11) NOT NULL, // root node id 
`parentID` INT(11) NOT NULL, // current parent id 
`childID` INT(11) NOT NULL, // child id (direct child of the parent) 
`level` INT(11) NOT NULL, // how far child is from root 
PRIMARY KEY (`rootID`, `parentID`, `childID`), 
UNIQUE INDEX `childID` (`childID`, `level`) 
) 

채우기 데이터를 해당 테이블도 꽤 큰 my_table 너무 오래 걸리지 않습니다에 대한.

0

마지막으로, mysql에는 계층 적 쿼리를 수행하는 기본 방법이 없었지만 다음과 같은 계층 구조를 인코딩하는 Managing Hierarchical Data in MySQL에서 논의 된 (다른 기술 중에서도) 인접성 목록과 같은 기술을 항상 사용할 수 있습니다. 다른 테이블을 사용하고 계층 구조에서 하위 트리를 검색하기 위해 조인 할 수 있습니다.

관련 문제