代码之家  ›  专栏  ›  技术社区  ›  Kerry Jones

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

  •  0
  • Kerry Jones  · 技术社区  · 14 年前

    我看过这个:

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

    这是关于CTE的,它在MySQL中不存在。我的结构如下:

    category_id | parent_category_id | name
    

    我要检索给定类别ID的所有子类别ID。如果不抓取层,然后循环访问这些层,这是否可能?

    1 回复  |  直到 13 年前
        1
  •  3
  •   PaÅ­lo Ebermann    13 年前

    这只是简单的一个 邻接模型 桌子?那么,如果不知道最大深度,在一个查询中是不可能的。

    思考的食物是 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>;