+-----------+-----------------+
| 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列出所有子孙。
例如AccountID(1)的子女和大孩子是2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 ,20 AccountID(14)的子女和大孩子分别为15,16,17,18,19,20
我尝试了很多查询,只返回一级。请帮忙解决这个问题。提前致谢
答案 0 :(得分: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+'->%';