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。