sql >> データベース >  >> RDS >> Mysql

カテゴリ階層(PHP / MySQL)

    隣接リストモデルを使用する場合、1回のパスで構造を生成できます。

    One Pass Parent-子配列構造(2007年9月、Nate Weinerによる)

    $refs = array();
    $list = array();
    
    $sql = "SELECT item_id, parent_id, name FROM items ORDER BY name";
    
    /** @var $pdo \PDO */
    $result = $pdo->query($sql);
    
    foreach ($result as $row)
    {
        $ref = & $refs[$row['item_id']];
    
        $ref['parent_id'] = $row['parent_id'];
        $ref['name']      = $row['name'];
    
        if ($row['parent_id'] == 0)
        {
            $list[$row['item_id']] = & $ref;
        }
        else
        {
            $refs[$row['parent_id']]['children'][$row['item_id']] = & $ref;
        }
    }
    

    リンクされた記事から、出力用のリストを作成するためのスニペットを次に示します。これは再帰的であり、ノードに子がある場合は、サブツリーを構築するために再度呼び出します。

    function toUL(array $array)
    {
        $html = '<ul>' . PHP_EOL;
    
        foreach ($array as $value)
        {
            $html .= '<li>' . $value['name'];
            if (!empty($value['children']))
            {
                $html .= toUL($value['children']);
            }
            $html .= '</li>' . PHP_EOL;
        }
    
        $html .= '</ul>' . PHP_EOL;
    
        return $html;
    }
    

    関連する質問:



    1. カンマ区切りの値に基づいてテーブルを結合する

    2. Hibernateを使用した単一列(クラス属性)の遅延フェッチ

    3. mysqlデータベースへの重複エントリを回避するための最良の方法

    4. SQL SELECT MIN