【问题标题】:Query all connected ancestors and descendants in a self referencing table查询自引用表中所有连接的祖先和后代
【发布时间】:2021-03-18 17:17:06
【问题描述】:

假设我有一个表 'prlines' 与相邻记录的自关系:

id | prev_id
------------
1  | NULL
2  | NULL
3  | 1
4  | 2
5  | 3
6  | 5

我想获取某个记录的所有连接 ID(上一个/下一个)。例如:

SELECT `prev_id` FROM `prlines` ... WHERE id = 5;

应该产生这个输出:

prev_id
-------
3
1
6

我目前正在做的是在 python 中创建一个 while 循环,它会生成多个查询来跟踪每条记录的关系。有什么想法可以在单个 mysql 查询中实现这一点吗?

【问题讨论】:

    标签: python mysql sql django self-referencing-table


    【解决方案1】:

    您可以使用递归 cte:

    with recursive cte(p, c, f) as (
       select p.*, p.prev_id = 5 from prlines p where p.id = 5 or p.prev_id = 5
       union all
       select p.*, c.f from cte c join prlines p on case when c.f then p.prev_id = c.p else p.id = c.c end
    )
    select case when f then p else c end prev_id from cte where c is not null order by f;
    

    输出:

    prev_id
    3
    1
    6
    7

    demo

    【讨论】:

    • 很好,但是它也可以向前爬行吗?它只前进了一步。如果我添加一个新行 (id:7, prev_id:6) 它应该被包括在内,但它不是。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2015-10-16
    相关资源
    最近更新 更多