SQL递归:从树中的给定节点中选择所有子项

时间:2012-01-15 11:51:43

标签: mysql sql

编辑:在阅读了一些你的答案后,我注意到我不需要递归,但有些查询可以使用树。我正在阅读以下帖子http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/,它提供了我不知道的基本概念和正确的方法。非常感谢,我将继续阅读已发布的链接:)

我在树上工作,每个节点都可以有孩子。每个节点都有子节点自己生成的node_id来引用其父节点。一个简单的表示例如下:

CREATE TABLE IF NOT EXISTS `arbres` (
  `node_id` int(11) NOT NULL AUTO_INCREMENT,
  `pare_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`node_id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=470 ;
ALTER TABLE arbres ADD CONSTRAINT FK_E6A4F221A4467B16 FOREIGN KEY (pare_id) REFERENCES arbres(node_id) ON DELETE CASCADE;

我正在尝试的是找到一个能够选择每个孩子的查询,依此类推,我指的是孩子的孩子,孩子孩子的孩子等等。我是sql的新手,所以我可以用多个sql语句完成它,这不是一个好主意。感谢你的时间。

1 个答案:

答案 0 :(得分:0)

您最好的选择是以节点为基础遍历树。由于没有保证你的树有多少级别,试图找到一个查询可能不是很好的做法。使用一个查询或过程可以多次返回给定父项的子项,如:

,这没有任何问题
select node_id from arbres where pare_id = 1

假设你的root是pare_id = 1 然后对返回的每个节点执行相同的操作。如果没有返回节点,那么您知道最后一个节点是叶子。

如果您真的需要在一个查询中完成所有这些,只需执行

select * from arbres

重构你正在使用的编程语言的树。