Php 在mysql中使用父子关系进行回溯?
我一直在使用亲子关系,如下所示Php 在mysql中使用父子关系进行回溯?,php,mysql,select,php-7,Php,Mysql,Select,Php 7,我一直在使用亲子关系,如下所示 id | parent_id | ---------------- 30 | 0 | 32 | 30 | 33 | 32 | 34 | 32 | ---------------- 我想获取34的历史记录,这样它将是id34,32,33(因为32是父对象)和30(直到父对象id=0) 我使用了self-join,但没有解决我的问题。我用php和mysql做这件事 查询 SELECT f1.id FR
id | parent_id |
----------------
30 | 0 |
32 | 30 |
33 | 32 |
34 | 32 |
----------------
我想获取34的历史记录,这样它将是id34,32,33(因为32是父对象)和30(直到父对象id=0)
我使用了self-join,但没有解决我的问题。我用php和mysql做这件事
查询
SELECT f1.id
FROM followup as f1
JOIN followup as f2
ON f1.id = f2.parent_id
WHERE f2.id <= 34
选择f1.id
从后续的f1
将后续操作作为f2连接
在f1.id=f2.parent\u id上
其中,SQL中的f2.id递归是使用公共表表达式(CTE)完成的,基本上是动态视图
WITH RECURSIVE rec (id, parent_id, level) AS (
SELECT id, parent_id, 0 FROM followup WHERE parent_id=0
UNION ALL
SELECT id, parent_id, level+1 FROM followup
JOIN rec ON followup.parent_id = rec.id
)
SELECT * FROM rec;
然而,这在MYSQL中还没有实现。这是即将发布的MySQL 8.0的文档草稿。
MySQL目前不支持此功能
MySQL不支持递归,除非您真的想尝试使用存储函数,这是非常难看的
最好将此结构转换为非规范化形式一次,并保持该结构不变
所以你需要保持这样的结构:
id ancestor_id distance
30 0 1
32 0 2
33 0 3
34 0 3
32 30 1
33 30 2
34 30 2
33 32 1
34 32 1
这将允许您执行线性查询,但会占用大量的插入逻辑,因为它必须为每个祖先节点插入一条记录。但由于通常插入信息的频率低于选择的频率,因此这将是一个更快的实现,它将解决您的问题不确定SQL中是否存在递归。我认为如果你收集所有的ID关系并用PHP处理它们会更容易。看到类似问题的一千个答案中的任何一个。我没有找到任何@strawberry。你可以检查这个我认为它可以帮助你。请告诉我们你现在得到了什么以及你想要什么o/p。