2010-09-26 190 views
3

我不完全确定我在说这个权利,但请耐心等待。SQL树遍历

我想知道是否可以做这样的事情在SQL(MySQL的具体): 比方说,我们有在下表中坚持在数据库树状数据:

mysql> desc data_table; 
    +------------------------+---------------------+------+-----+---------+----------------+ 
    | Field     | Type    | Null | Key | Default | Extra   | 
    +------------------------+---------------------+------+-----+---------+----------------+ 
    | id      | int(10) unsigned | NO | PRI | NULL | auto_increment | 
    | parent_id    | int(10) unsigned | YES | MUL | NULL |    | 
    | value     | text    | YES |  | NULL |    | 

所以每行都有一个父级,除了“根”行以外,每行都有除叶行以外的子级。

是否有可能找到所有使用SQL的给定行的所有后代?

回答

8

可以仅使用SQL获取所有后代,但不能在单个查询中获取。但我相信你明白了这一点;我假设你的意思是你想在单个查询中完成它。

您可能有兴趣阅读一些用于存储树结构的替代设计,这些设计使您可以使用单个SQL查询获取所有后代。看到我的介绍Models for Hierarchical Data with SQL and PHP

您还可以对其他品牌的数据库(例如PostgreSQL)使用递归SQL查询,但MySQL目前不支持此功能。

+0

+1:很好的演示文稿,我会在接下来的一两个月内使用! – 2010-09-27 00:54:30

0

您可能更喜欢使用嵌套集合模型(请参阅http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - 进一步下载)。它的选择效率更高,您可以通过简单的自连接获得每个节点的完整路径。 但是,实际上,如果您希望执行诸如“where depth = 3”之类的操作,并且希望显示多个节点的完整路径(如果表中的记录超过1000条),则预先缓存路径和深度。