gpt4 book ai didi

php - 在具有父子关系的 mysql 中回溯?

转载 作者:行者123 更新时间:2023-11-28 23:13:54 25 4
gpt4 key购买 nike

我一直在使用如下的父子关系

id | parent_id | 
----------------
30 | 0 |
32 | 30 |
33 | 32 |
34 | 32 |
----------------

我想获取 34 的历史记录,以便它的 ID 为 34、32、33(因为 32 是父级)和 30(直到父级 id = 0)

我使用了自连接但没有解决我的问题。我正在使用 mysql 在 php 中执行此操作。

查询

SELECT f1.id 
FROM followup as f1
JOIN followup as f2
ON f1.id = f2.parent_id
WHERE f2.id <= 34

谁能帮帮我?

最佳答案

SQL 中的递归是使用公用表表达式 (CTE) 完成的,它基本上是动态 View 。

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 的草稿文档。 https://dev.mysql.com/doc/refman/8.0/en/with.html

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

这将允许您进行线性查询,但插入逻辑会很繁重,因为它必须为每个祖先节点插入一条记录。但是由于通常插入信息的频率低于选择信息的频率,这将是一个更快的实现,它会解决您的问题

关于php - 在具有父子关系的 mysql 中回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com