2014-12-16 3 views
0
+-----------+-----------------+ 
| AccountID | ParentAccountID | 
+-----------+-----------------+ 
|   1 |   NULL | 
|   2 |    1 | 
|   3 |    2 | 
|   5 |    3 | 
|   6 |    5 | 
|   7 |    6 | 
|   8 |    7 | 
|   9 |    8 | 
|  10 |    9 | 
|  11 |    10 | 
|  12 |    11 | 
|  13 |    12 | 
|  14 |    13 | 
|  15 |    14 | 
|  16 |    15 | 
|  17 |    16 | 
|  18 |    17 | 
|  19 |    18 | 
|  20 |    19 | 
+-----------+-----------------+ 

부모 계정 ID를 기반으로 모든 하위 및 손자를 나열하는 간단한 쿼리를 찾고 있습니다.Mysql이 조부모 손자들을 끝까지 만남

예를 들어, AccountID (1)의 아동 및 아동은 2,3,4,5,6,7,8,9,1011121314151617181920 19,2 또한 AccountID (14)의 어린이 및 청소년은 15,16,17,18,19,20

입니다. 많은 질문을 시도했지만 단 하나의 레벨 만 반환했습니다. 이 문제를 해결하는 데 도움주세요. 미리 감사드립니다.

+0

질문이 내게 명확하지 않습니다. 부모 계정 ID 또는 계정 ID를 기반으로 계정 ID를 제공하면 지정된 ID보다 큰 ID를 인쇄해야합니다. – Ali786

+0

당신은 또한 원하는 출력 형식을 언급해야합니다 –

+0

나는 이것을 시도했습니다 B.AccountID FROM family1 P INNER JOIN 패밀리 1 B ON P.AccountID = B.ParentAccountID WHERE P.ParentAccountID = '1' dsnt는 모든 하위 계정을 반환합니다. 맨 아래쪽 (테이블 이름은 family1) –

답변

1

두 계층까지만이 아니라 전체 계층 구조를 원합니다. 따라서이 경우 테이블에 다른 열을 추가해야합니다.

+-----------+-----------------++-----------------+ 
| AccountID | ParentAccountID | Hierarchy  | 
+-----------+-----------------+------------------+ 
|   1 |   NULL |     | 
|   2 |    1 |-1->    | 
|   3 |    2 |-1->-2->   | 
|   5 |    3 |-1->-2->-3->  | 
|   6 |    5 |-1->-2->-3->-5-> | 
+-----------+-----------------+-+----------------+ etc. 

구조를 작성하는 방법에 대한 힌트를 제공합니다.

DELIMITER $$ 

CREATE PROCEDURE build_hierarchy() 
BEGIN 
DECLARE v_finished INTEGER DEFAULT 0; 
Declare var_AccountId integer; 
Declare var_ParentAccountID integer; 
Declare var_Hierarchy integer; 
Declare cur_all_accounts cursor for select * from accounts; 
-- declare NOT FOUND handler 
DECLARE CONTINUE HANDLER 
     FOR NOT FOUND SET v_finished = 1; 
get_data: LOOP 

FETCH cur_all_accounts INTO var_AccountId, var_ParentAccountID,var_Hierarchy ; 

IF v_finished = 1 THEN 
LEAVE get_data; 
END IF; 

Update Accounts set hierarchy = (select Hierarchy + '-' + accountId + '->' from Accounts 
where accountId = var_ParentaccountId) where AccountID = var_accountId; 

END LOOP get_data; 

CLOSE cur_all_accounts; 

END$$ 

DELIMITER ; 

그런 다음 절차를 실행하십시오.

CALL build_hierarchy(); 

parentAccountId = 1에 대한 계층 구조를 가져 오려면 다음 쿼리를 실행하십시오.

select AccountID from Accounts where Hierarchy like = '%-' + parentAccountId+'->%'; 
+0

이 쿼리는 두 개의 AccountID 만 반환합니다. family1 FROM SELECT WHERE ParentAccountID 계정 ID = 1 UNION family1 FROM ALL SELECT 계정 ID WHERE ParentAccountID IN (family1 FROM 계정 ID를 선택 WHERE ParentAccountID = 1) = 결과> + ----------- + | AccountID | + ----------- + | 2 | | 3 | + ----------- + –

+0

이것은 전체 계층 구조를 원한다는 것을 의미합니다. 따라서이 경우 테이블에 다른 열을 추가해야합니다. –