1

我有一张名为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>";
?>

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

4

3 回答 3

1

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

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
于 2013-06-14T14:51:34.440 回答
1

您可以使用mysql 嵌套集模型(此链接也应该回答您所有相关的问题)

但是,像您所做的那样,使用父 ID 的方法是一种很好的方法,因为它简单且健壮。

它只是在某些情况下缺乏性能。

基本上没有别的办法,只能通过迭代和计算迭代来选择父级。

您可以在 php 中使用单独的查询以及内部 mysql 函数(过程)来执行此操作。如果你在 postgres 上,你也可以进行递归查询。

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

于 2013-06-14T15:01:23.820 回答
1

You could try to just read all data from MySQL and construct a tree with PHP manually, if your database is not big it will be the easiest way to do.

于 2013-06-14T15:22:05.253 回答