Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL递归:选择树中给定节点中的所有子节点_Mysql_Sql - Fatal编程技术网

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

Mysql SQL递归:选择树中给定节点中的所有子节点,mysql,sql,Mysql,Sql,编辑:在阅读了你的一些答案后,我注意到我不需要递归,而是需要一些查询来处理树。我目前正在阅读下面的帖子,它给出了我不知道的基本概念和正确的方法。所以非常感谢,我会继续阅读张贴的链接:) 我正在研究一个树,其中每个节点都可以有子节点,也可以没有子节点。每个节点都有自己的子节点自动生成的节点id,以引用其父节点。下面是一个简单的表格示例: CREATE TABLE IF NOT EXISTS `arbres` ( `node_id` int(11) NOT NULL AUTO_INCREMENT

编辑:在阅读了你的一些答案后,我注意到我不需要递归,而是需要一些查询来处理树。我目前正在阅读下面的帖子,它给出了我不知道的基本概念和正确的方法。所以非常感谢,我会继续阅读张贴的链接:)

我正在研究一个树,其中每个节点都可以有子节点,也可以没有子节点。每个节点都有自己的子节点自动生成的节点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; 如果不存在“arbres”,则创建表( `节点id`int(11)非空自动增量, `pare_id`int(11)默认为空, 主键(`node_id`), )ENGINE=InnoDB默认字符集=utf8自动增量=470; ALTER TABLE arbres ADD CONSTRAINT FK_E6A4F221A4467B16外键(pare_id)引用DELETE级联上的arbres(节点_id);
我试图找到一个可以选择每个孩子的查询,我指的是一个查询中的孩子,孩子中的孩子,等等。我对sql非常陌生,所以我可以用多个sql语句来完成它,这不是一个好主意。谢谢您的时间。

您最好的选择是在节点的基础上遍历树。由于不知道树有多少层,所以尝试查找一个查询可能不是很好的做法。使用一个查询或过程多次返回给定父级的子级没有什么错,如:

select node_id from arbres where pare_id = 1
这是假设你的根是pare_id=1 然后对返回的每个节点执行相同的操作。如果没有返回任何节点,则您知道最后一个节点是叶

如果您真的需要在一个查询中实现所有这些,只需执行以下操作

select * from arbres

以及您正在使用的编程语言的树。

也许这会让您开始:MySQL不支持递归查询。您可能需要创建一个执行此操作的存储过程、更改数据模型或“升级”到支持递归查询(如PostgreSQL或Firebird(或任何商业查询))的DBMS。请查看以下答案“尝试查找一个查询可能不是很好的做法”。请注意,这仅适用于MySQL。其他数据库管理系统使得在单个查询中执行此类操作非常容易(而且非常高效)。我必须说,我从未使用过递归查询功能,只使用过我认为不适合这种情况的嵌套查询