【问题标题】:MySql Loan table, for each borrower find the root lenderMySql Loan 表,为每个借款人找到根贷方
【发布时间】:2020-03-14 07:22:05
【问题描述】:

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

如您所见,不向任何人借款的借款人(LENDER 列中为 NULL)在输出中被认为是向自己借款。

在我的例子中,这个借贷者层次结构可能非常大(超过 200k),我想递归可能不是一个好方法,但欢迎提出任何建议。

【问题讨论】:

    标签: mysql hierarchical-data mysql-5.7 hierarchical


    【解决方案1】:

    如果您运行的是 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

    【讨论】:

      【解决方案2】:

      你有一些选择:

      从 MySQL 8 开始,您可以执行递归 CTE 查询。比如

      with recursive x (borrower, root_lender) as (
          select borrower, borrower root_lender from rels where lender is null
          union all
          select r.borrower, x.root_lender from rels r inner join x on r.lender = x.borrower
      )
      select * from x order by borrower;
      

      但你说你有很多关系。

      另一种方法是存储在另一个树表示中。

      1. root_lender 添加到每一行并在每次插入时实现;
      2. 将树存储为具体化路径。您必须添加一个新的一列来存储当前节点的路径。

      【讨论】:

      • 你能更详细地解释一下“另一种方式”吗?特别是第二点。
      • 是的。添加一个额外的列来存储路径。例如:borrower | lender | path1 | NULL | /12 | 1 | /1/23 | 2 | /1/2/34 | 1 | /1/4 你会看到使用一个查询你可以获取每个贷方的所有借款人,而不仅仅是我的意思是 root。
      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多