MySQL - 是否有可能获得层次结构中的所有子项?

时间:2010-06-18 23:14:24

标签: sql mysql

我看过这个:

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

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

category_id | parent_category_id | name

我想检索给定category_id的所有子类别id。这是否可能没有抓住一层,然后循环通过那些?

1 个答案:

答案 0 :(得分:3)

这只是一个简单的邻接模型表?然后在不知道最大深度的情况下在一个查询中是不可能的。

值得深思的是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>;