MySQL - 是不是可以获取层次结构中的所有子项?

Posted

技术标签:

【中文标题】MySQL - 是不是可以获取层次结构中的所有子项?【英文标题】:MySQL - Is it possible to get all sub-items in a hierarchy?MySQL - 是否可以获取层次结构中的所有子项? 【发布时间】:2010-06-18 23:14:24 【问题描述】:

我看过这个:

Select products where the category belongs to any category in the hierarchy

它正在谈论 CTE,它在 mysql 中不存在。我的结构如下:

category_id | parent_category_id | name

我想检索给定 category_id 的所有子类别 ID。这是否可能在不获取层的情况下,然后循环遍历这些层?

【问题讨论】:

【参考方案1】:

这只是一个邻接模型表?那么在不知道最大深度的情况下,不可能在一次查询中进行。

值得深思的是Managing Hierarchical Data in MySQL(尽管我不提倡将嵌套集模型用于定期更改的数据)。

有很多(左)连接,更具体地说:左连接与树的最大深度一样多,在一个查询中就有可能。这就是很多人倾向于保存特定类别的“深度”的原因,因此您将能够过滤并将同一个表的连接数量限制在更合理的数量。

就个人而言,对于定期更改数据:我倾向于在插入/更新时配置触发器,这将根据 id 保存/缓存节点的当前“路径”(例如:路径为 '12/62/ 28/345',其中分隔符/之间的每一步都是正确顺序的父节点的主键(345的父节点是28,28的父节点是62,等等),所以我可以只查询它一个这样的连接(/用作分隔符):

SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND  j.id != o.id  -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;

【讨论】:

以上是关于MySQL - 是不是可以获取层次结构中的所有子项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的触摸位置获取层次结构中的所有视图 - Swift

将子项和父项的平展列表到树视图层次结构

从 Flutter 中的 List 获取一个子子项

实体框架查询以获取子项[重复]

获取针对特定子项的父记录或针对父项获取子记录的查询是啥?

Rails 4+ 最佳实践:删除父项同时保留子项