【问题标题】:Sql Query to return leaf nodes?Sql Query返回叶节点?
【发布时间】:2013-02-15 03:15:35
【问题描述】:

您好,我有一个如下表

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

【问题讨论】:

标签: mysql sql hierarchical-data


【解决方案1】:

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

有很多可能的方法。

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

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

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

附加信息:

Managing Hierarchical Data in MySQL (by Mike Hillyer)

Google search: sql tree structure

PHP 方法:

php / Mysql best tree structure

PHP tree structure for categories and sub categories without looping a query

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

Models for hierarchical data - presentation by Bill Karwin / Karwin Software Solutions LLC

【讨论】:

  • 是的,这对我来说是一个更好的解决方案。谢谢,我会找到的
  • @Kamil 。 . .我几乎想投反对票(我很少这样做),因为声明:“SQL 不是处理树结构的最佳方法,因为树结构可能有无限的层次,并且没有(有效的)方法用 SQL 语言处理这样的递归”。一些数据库确实很好地支持树结构。您的说法适用于 MySQL,但一般不适用于 RDBMS。
  • @GordonLinoff: Several databases do support tree structures very well. -- 是的,但是带有供应商特定的扩展,不在 SQL92 中。
  • @罗伯特哈维。 . .例如,您必须使用 PL/SQL 的语句是错误的。 Oracle 为其 SQL 提供connect by 语法。
  • 你现在有我的支持。您还可以添加指向Bill Karwin's 幻灯片的链接,以了解 Hierarchical models in MySQL,其中比较了 4 个模型(更多地关注 Closure 模型。)
【解决方案2】:

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

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

【讨论】:

  • 谢谢你的闲言碎语:)我需要习惯使用所有这些
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多