我有一个包含以下字段的表:
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
答案 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;
那会让你到处找。