Python 在自引用表中查询所有连接的祖先和后代
假设我有一个在相邻记录上具有自关系的表“prlines”:Python 在自引用表中查询所有连接的祖先和后代,python,mysql,sql,django,self-referencing-table,Python,Mysql,Sql,Django,Self Referencing Table,假设我有一个在相邻记录上具有自关系的表“prlines”: id |上一个id ------------ 1 |空 2 |零 3 | 1 4 | 2 5 | 3 6 | 5 我想获取某个记录的所有连接ID(上一个/下一个)。例如: 从'prlines'中选择'prev\u id'。。。其中id=5; 应产生以下输出: prev\u id ------- 3. 1. 6. 我目前所做的是在python中创建一个while循环,该循环生成多个查询以跟踪每条记录的关系。在单个mysql查
id |上一个id
------------
1 |空
2 |零
3 | 1
4 | 2
5 | 3
6 | 5
我想获取某个记录的所有连接ID(上一个/下一个)。例如:
从'prlines'中选择'prev\u id'。。。其中id=5;
应产生以下输出:
prev\u id
-------
3.
1.
6.
我目前所做的是在python中创建一个while循环,该循环生成多个查询以跟踪每条记录的关系。在单个mysql查询中实现这一点有什么想法吗?您可以使用递归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;
输出:
上一个id
3.
1.
6.
7.
非常好,但是它也能向前爬行吗?它只前进了一步。如果我添加了一个新行(id:7,prev_id:6),它应该包括在内,但不是。@sandrows请查看我最近的编辑。