我有一个Mysql表,如下所示:
BORROWER Lender
1 2
2 3
3 4
4 NULL
5 NULL
6 7
7 5
我想为每一个借贷者找一个借贷者。你可以把根贷款人看作是资金的来源。因此,如果一个人“1”向“2”借款,而“2”向“3”借款,那么对于“1”来说,借款来源(即根本贷款人)是“3”。
以下所示的预期输出应有助于更好地理解问题:
BORROWER ROOT_LENDER
1 4
2 4
3 4
4 4
5 5
6 5
7 5
如您所见,不向任何人借款(贷方栏中为空)的借款人被视为在输出中向自己借款。
在我的情况下,借款人-贷款人的层次结构可能非常大(超过200k),我想递归可能不是一个好的方法,但任何建议都是受欢迎的。
最佳答案
如果运行的是MySQL 8.0,请考虑以下递归查询:
with recursive cte as (
select borrower original_borrower, borrower, lender, 0 lvl from mytable
union all
select c.original_borrower, t.borrower, t.lender, lvl + 1
from mytable t
inner join cte c on t.borrower = c.lender
)
select original_borrower borrower, lender
from cte c
where lvl = (
select max(lvl) - 1 from cte c1 where c1.original_borrower = c.original_borrower
)
order by original_borrower
递归查询从表中可用的所有记录开始,爬升层次结构树,同时跟踪原始
borrower
和树中的级别。然后,外部查询过滤每个子树中的最后一条记录。Demo on DB Fiddle:
借款人|贷款人
-------: | -----:
1 | 4个
2 | 4个
3 | 4个
6 | 5个
7 | 5个