我有一个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个

10-06 03:56