MySQL的先前等效连接

Jak*_*ake 18 mysql sql stored-procedures

所有,

我在表中有三个字段,用于定义MySQL数据库版本5.0中存在的父子关系.表名是tb_Tree,它具有以下数据:

Table Name: tb_Tree

Id | ParentId | Name
--------------------
1  | 0        | Fruits
2  | 0        | Vegetables
3  | 1        | Apple
4  | 1        | Orange
5  | 2        | Cabbage
6  | 2        | Eggplant
Run Code Online (Sandbox Code Playgroud)

如果指定了ParentId,如何编写查询以获取所有子项.请注意,给出的表条目只是示例数据,它们可以包含更多行.Oracle有一个"CONNECT BY PRIOR"子句,但我没有找到类似MySQL的东西.任何人都可以建议吗?

谢谢

mu *_*ort 10

MySQL不支持递归查询,所以你必须这么做:

  1. 选择您的根ParentID = X所在的行X.
  2. Id从(1)中收集值.
  3. Id从(2)开始重复(1 ).
  4. 手动保持递归,直到找到所有叶节点.

如果您知道最大深度,那么您可以将表连接到自身(使用LEFT OUTER JOIN)到最大可能深度,然后清理NULL.

您还可以将树表示更改为嵌套集.


小智 6

可能发帖晚了。

使用 MySQL8,您可以通过递归子句来实现它。这是一个例子。

 with recursive cte (id, name, parent_id) as (
  select     id,
             name,
             parent_id
  from       products
  where      parent_id = 19
  union all
  select     p.id,
             p.name,
             p.parent_id
  from       products p
  inner join cte
          on p.parent_id = cte.id
)
select * from cte;
Run Code Online (Sandbox Code Playgroud)

如需更多帮助,请找到另一个线程,希望它会对某人有所帮助。