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組織の親組織を定義します。

最初は素晴らしいアイデアに見えました。したがって、1 つのテーブルに無限にネストされた子組織を作成したことになります。

今、組織の深さを判断する方法に行き詰まっています。

私の現在の試みは今のところ次のようなものです:

<?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>";
?>

このコードでは、2 つのレベルしか得られません。リストに第 3 レベルの組織が表示されていないと思います。私の質問は、この状況で組織の深さをどのように知っているのでしょうか? それとも別のアプローチがありますか?

4

3 に答える 3

1

mysql ネストされたセット モデルを使用できます(このリンクは、関連するすべての質問にも回答する必要があります)。

ただし、親IDを使用したアプローチは、シンプルで堅牢であるため、優れています。

場合によってはパフォーマンスが不足するだけです。

基本的には、反復によって常に親を選択し、反復をカウントする以外に方法はありません。

個別のクエリと内部の mysql 関数 (手順) を使用して、php でそれを行うことができます。postgres を使用している場合は、再帰クエリを作成することもできます。

あなたの場合、親と一緒に深さを保存するのが最善だと思いますが、何かが変わったときに再計算する必要があることに注意してください。

于 2013-06-14T15:01:23.820 に答える
1

データベースが大きくない場合は、MySQL からすべてのデータを読み取り、手動で PHP を使用してツリーを構築することができます。これが最も簡単な方法です。

于 2013-06-14T15:22:05.253 に答える