Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在自引用表中查询所有连接的祖先和后代_Python_Mysql_Sql_Django_Self Referencing Table - Fatal编程技术网

Python 在自引用表中查询所有连接的祖先和后代

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查

假设我有一个在相邻记录上具有自关系的表“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查询中实现这一点有什么想法吗?

您可以使用递归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请查看我最近的编辑。