递归选择类别

时间:2015-10-14 13:33:55

标签: mysql sql recursion

我有一个包含以下字段的表:

node_id (int, AI)
category_id, (int)
parent_node_id (int)

如何选择从给定类别ID挂起的所有节点(或类别,如果您愿意)。而“挂断”是指所有递归存储的节点。

示例:

Category  node  parent 
       1     1  none
       2     2  none
       3     3  none

       4     4       1
       5     5       4
       6     6       5

select的预期输出:

Category  node  parent 
       1     1  none
       4     4       1
       5     5       4
       6     6       5

3 个答案:

答案 0 :(得分:1)

根据我的假设,我完全不知道你在寻找什么。

DECLARE @Table1  TABLE 
    (node_id varchar(9), category_id varchar(5), parent_node_id varchar(11))
;

INSERT INTO @Table1
    (node_id, category_id, parent_node_id)
VALUES
    ('Category1', 'node1', 'parentnone.'),
    ('Category2', 'node2', 'parentnone.'),
    ('Category3', 'node3', 'parentnone.'),
    ('Category4', 'node4', 'parent1.'),
    ('Category5', 'node5', 'parent4.'),
    ('Category6', 'node6', 'parent5.')
;
select node_id, category_id, parent_node_id from (
select node_id, category_id, parent_node_id,Row_number()OVER(PARTITION BY parent_node_id ORDER BY node_id desc)RN from @Table1
GROUP BY node_id, category_id, parent_node_id
)T
WHERE T.RN = 1
--ORDER BY cat desc
ORDER BY  RIGHT(category_id,1) 

答案 1 :(得分:1)

您可以创建一个函数,该函数将返回该类别是否为您感兴趣的任何级别的子级。

CREATE FUNCTION `is_child_of`(id INT, related_to_id INT) RETURNS int(11)
BEGIN
    DECLARE `exists` BOOL;
    /* to avoid infinite loop */
    SELECT EXISTS(SELECT `parent_id` FROM `category` WHERE `category_id` = id) INTO `exists`;
    IF `exists` IS FALSE THEN
        RETURN 0;
    END IF;

    WHILE id IS NOT NULL DO
        IF id = related_to_id THEN
            RETURN 1;
        END IF;

        SELECT `parent_id` INTO id FROM `category` WHERE `category_id` = id;
    END WHILE;
    RETURN 0;
END

然后,只需选择您要深入了解的类别的结果。

例如,对于ID为1的类别

SELECT * FROM `category` WHERE `is_child_of`(category_id, 1);

我承认它远没有效率。在关系数据库中处理层次结构时很难有效。

答案 2 :(得分:0)

假设该表名为categories

select
    children.category_id as category,
    children.node_id as node,
    parent.node_id as parent_node_id
from categories parent 
join categories children
on parent.node_id = children.parent_id;

那会让你到处找。

相关问题