数据库中组织的无尽嵌套树

时间:2013-06-14 14:37:46

标签: php mysql

我有一个名为Organizations

的表格
 id  |  organization |  parent_id
-----+---------------+-----------
 51  |  Organ1       |    0
 71  |  Organ2       |    0
 83  |  Organ2.1     |   71
 89  |  Organ1.1     |   51
 104 |  Organ1.1.1   |   89
...

拥有parent_id = 0的组织是根组织。现在我看到我错了。 parent_id定义组织的父组织。

首先对我来说这看起来很棒。因此,我会在一个表中创建无穷无尽的嵌套子组织。

现在我被困在如何确定组织的深度。

我目前的尝试现在如下:

<?php
$queryRootOrg = $db->prepare("SELECT * FROM Organizations WHERE parent_id = 0" );

$queryRootOrg ->execute();
$menu = "<ul id='menu'>";

if($queryRootOrg ->rowCount() > 0)
{
    while($rowRoot = $queryRootOrg ->fetch(PDO::FETCH_ASSOC))
    {
        $menu .= "<li><a href='?org=".$rowRoot['id']."'>".$rowRoot['birim']."</a>";

        $queryChildren= $db->prepare("SELECT * FROM Organizations WHERE parent_id = :p1");
        $queryChildren->bindValue(":p1", $rowRoot['id'], PDO::PARAM_INT);

            $queryChildren->execute();

        if ($queryChildren->rowCount() > 0)
        {
            $menu .= "<ul>";
            while($rowSub = $queryChildren->fetch(PDO::FETCH_ASSOC))
            {
                $menu .= "<li><a href='?org=" . $rowSub['id'] . "'>" . $rowSub['birim'] . "</a></li>";
            }
            $menu .= "</ul>";
        }
        $menu .= "</li>";
    }
}

$menu .= "</ul>";
?>

这段代码只给我两个层次。我想我无法在列表中看到第三级组织。 我的问题是,在这种情况下,我怎么知道组织的深度?还是有另一种方法吗?

3 个答案:

答案 0 :(得分:1)

请参考以下链接,因为它提供了通过树状结构进行路由的所有方法,

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

答案 1 :(得分:1)

您可以使用mysql nested set model(此链接也应该回答您所有相关的任务)

然而,与您一样,父ID的方法是一个很好的方法,因为它简单而且健壮。

在某些情况下,它只缺乏表现。

基本上除了总是通过迭代和计算迭代来选择父项之外别无他法。

你可以在php中使用单独的查询以及内部mysql函数(过程)来做到这一点。如果你在postgres上,你也可以进行递归查询。

在你的情况下,尽管我认为最好将深度与父母一起存储,但请记住,当事情发生变化时你必须重新计算它。

答案 2 :(得分:1)

您可以尝试只读取MySQL中的所有数据并手动构建一个PHP树,如果您的数据库不大,那么这将是最简单的方法。