0

嗨我有一个表如下

ID  ||  NAME ||  PARENTID ||  LEAF  
1   ||   A   ||    NULL   ||   0      
2   ||   B   ||     1     ||   0  
3   ||   c   ||     2     ||   1  
4   ||   A   ||     1     ||   1

它是数据表中的一种树形结构。我想检索特定父节点的所有叶节点(Leaf=1),有人可以建议我对此进行 sql 查询吗?

我试过这个:

select ( SELECT LEAF,NAME FROM Tablex WHERE PARENTID=1) from Tablex where LEAF=1
4

2 回答 2

3

数据库中的树结构是一个非常常见的问题。

有许多可能的方法。

SQL(在 MySQL 中)不是处理树结构的最佳方法,因为树结构可能有无限的层次,并且在 MySQL 中没有(有效的)处理递归的方法,因为您必须 JOIN 表 n 次,其中n 是树的级别数。当级别数可能不同时 - 您必须在 PL/SQL(过程 SQL)中使用一些存储过程,这将比 PHP、C 或其他语言中的简单循环更有效(更慢并且会使用更多内存)。

请考虑使用其他语言(PHP 或您正在使用的其他语言)将表格转换为树。

正如 Gordon Linoff 和 ypercube 在评论中所写,有更高级的数据库(如 Oracle),在这些数据库中处理树在编程/编码中更加有效和舒适。

附加信息:

在 MySQL 中管理分层数据(作者 Mike Hillyer)

谷歌搜索:sql树结构

PHP方法:

php/Mysql 最好的树形结构

类别和子类别的 PHP 树结构,无需循环查询

还有一个来自ypercube的有用链接:

分层数据模型 - Bill Karwin / Karwin Software Solutions LLC 的介绍

于 2013-02-28T19:43:01.753 回答
1

您尝试的查询应如下所示:

select tt.* FROM 
( SELECT LEAF,NAME FROM Tablex WHERE PARENTID IS NOT NULL and PARENTID=1 ) AS tt 
WHERE leaf=1;

如果您想进一步使用它,这里是 SQL Fiddle:http ://sqlfiddle.com/#!2/2d95b8/2

于 2013-02-28T20:11:41.780 回答