【问题标题】:MySQL: Find all the leaf nodes of a subtreeMySQL:查找子树的所有叶节点
【发布时间】:2015-08-19 11:17:27
【问题描述】:

我有一个存储在 mySQL 表中的类别树结构,具有 category_idparent_id 关系。 Parent_id = Null 对应根节点。

Category (category_id, category_name, parent_id)

我要做的是获取所有叶节点,并给出节点的 category_id。我关注了this 文章。它讨论了使用以下查询获取所有叶节点:

SELECT t1.category_name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent_id
WHERE t2.category_id IS NULL;

但我正在尝试获取子树的叶节点。例如:

在给定节点 3 的上述结构中,结果将是:9、10、7、11、12、13。

我也尝试过这里给出的解决方案:adjacency model , given an id return the leaf nodes。但我无法得到想要的结果。

你能帮我找到解决办法吗?

【问题讨论】:

    标签: php mysql tree adjacency-list adjacency-list-model


    【解决方案1】:

    哦,好吧...我碰巧找到了解决方案...但是有点尴尬:

    SELECT TRIM(RIGHT(TRIM(concat_ws(' ',
    ifnull(t1.category_id,''),
    ifnull(t2.category_id,''),
    ifnull(t3.category_id,''),
    ifnull(t4.category_id,'')
    )),2)) AS leaf_node
    FROM category AS t1
    LEFT JOIN category AS t2 ON t2.parent_category = t1.category_id
    LEFT JOIN category AS t3 ON t3.parent_category = t2.category_id
    LEFT JOIN category AS t4 ON t4.parent_category = t3.category_id
    WHERE t1.category_descr = 'Frames';
    

    只要category_id

    【讨论】:

      【解决方案2】:

      如果您的叶子是有序的(即任何孩子都大于其父母),还有另一种方式:

      SELECT tree.id FROM tree
      LEFT JOIN tree t1 ON (t1.parent_id = tree.id)
      WHERE t1.id IS NULL -- all leafs
      AND tree.id > 3 -- greater than starting branch
      

      【讨论】:

        【解决方案3】:

        你可以试试这个脚本:

        Select * from
        (SELECT id,name,parent_id FROM
            (SELECT id,name,parent_id,
                   CASE WHEN id in (3) THEN @idlist := CONCAT(id)
                        WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id)
                        END as checkId
            FROM categories
            ORDER BY id ASC) as T
        WHERE checkId IS NOT NULL) N1
        left join 
        (SELECT id,name,parent_id FROM
            (SELECT id,name,parent_id,
                   CASE WHEN id in (3) THEN @idlist := CONCAT(id)
                        WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id)
                        END as checkId
            FROM categories
            ORDER BY id ASC) as T
        WHERE checkId IS NOT NULL) N2 on N1.Id = N2.Parent_Id
        

        sqlfiddle

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-16
          • 1970-01-01
          • 2016-11-21
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多