3

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

Category (category_id, category_name, parent_id)

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

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。但我无法得到想要的结果。

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

4

3 回答 3

1

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

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
于 2018-01-16T12:59:41.190 回答
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< 100,即只有两位数,它就可以工作,但这很容易适应。是的,一个完全疯狂/尴尬/(你可以命名的)解决方案,但它适用于我的目的。

于 2017-05-23T21:53:33.837 回答
0

你可以试试这个脚本:

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

于 2019-09-05T08:21:38.163 回答