2012-02-07 20 views
1

私はこの記事を読んでいました。http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ネストされたセットモデルを使用したSQLクエリとPHP操作

私は簡単な例を挙げたがって、どのようにして目的の結果が得られるか質問したかったですか?そこでここでは一例です:

私はPHPでデータを照会してから操作した後、HTMLで次の結果を表示できるようにしたい
+---------+-----------------------------+ 
| product_id | product_name   | 
+---------+-----------------------------+ 
|   1 | Example Product   | 
+---------+-----------------------------+ 
+---------+-----------------------------+ 
| product_id | category_id    | 
+---------+-----------------------------+ 
|   1 | 2      | 
|   1 | 4      | 
+---------+-----------------------------+ 
+-------------+--------------------+------+------+ 
| category_id | name     | lft | rgt | 
+-------------+--------------------+------+------+ 
|   1 | Electronics   | 1 | 8 | 
|   2 | Televisions   | 2 | 3 | 
|   3 | Portable Electronics | 4 | 7 | 
|   4 | CD Players   | 5 | 6 | 
+-------------+--------------------+------+------+ 

"Example Product" Categories: 
Electronics 
    Televisions 
    Portable Electronics 
     CD Players 

は、クエリを通じて、私を歩いて助けることができますこの結果を得るためのPHPでの操作?考える

一部仕様:両方のカテゴリはエレクトロニクスの下にありますが、「エレクトロニクス」

  • 以下の結果にそれが属しているサブカテゴリのそれぞれを表示し、一度だけここに表示されますどのように

    1. お知らせは最終的にする必要がありますサブカテゴリの配列を含むPHP多次元配列と、存在する場合は各サブカテゴリの配列を含む各サブカテゴリを含みます。

    HTMLで正しいツリーを構築するには、深さを印刷することが非常に重要であると想像してください。

    答えて

    3

    私はここに私の解決策だ。これは、素敵な挑戦だと思った:

    は、基本的には:ノードを読んで、その後、あなたのrgtよりも小さいrgtと、次のすべてのノードがあなたの子で、再帰的にこれを行います。 私はpeek/consumeを使用して、通常どおりにmysqlから読み込みました。

    クエリで結果が得られない場合、またはデータセットがが破損した場合は、が壊れます。

    class NestedNodeReader { 
    
        private $mysql_result; 
        private $peeked = false; 
        private $last_peek; 
    
        public function __construct($mysql_result) { 
         $this->mysql_result = $mysql_result; 
        } 
    
        public function getTree() { 
         $root = $this->consume(); 
         $root["children"] = $this->getSubTree($root["rgt"]); 
         return $root; 
        } 
    
        private function getSubTree($stop_at) { 
         $nodes = array(); 
         $node = $this->peek(); 
         while ($node["rgt"] < $stop_at) { 
          $node = $this->consume(); 
          $node["children"] = $this->getSubTree($node["rgt"]); 
          $nodes[] = $node; 
          $node = $this->peek(); 
          if (false === $node) { 
           break; 
          } 
         } 
         return $nodes; 
        } 
    
        private function peek() { 
         if (false === $this->peeked) { 
          $this->peeked = true; 
          $this->last_peek = mysql_fetch_assoc($this->mysql_result); 
         } 
         return $this->last_peek; 
        } 
    
        private function consume() { 
         if (false === $this->peeked) { 
          return mysql_fetch_assoc($this->mysql_result); 
         } else { 
          $this->peeked = false; 
          return $this->last_peek; 
         } 
        } 
    } 
    
    $query = "SELECT node.name, node.lft, node.rgt 
        FROM nested_category AS node, 
         nested_category AS parent 
        WHERE node.lft BETWEEN parent.lft AND parent.rgt 
         AND parent.name = 'ELECTRONICS' 
        ORDER BY node.lft;" 
    $mysql_result = mysql_query($query); 
    $nnr = new NestedNodeReader($mysql_result); 
    print_r($nnr->getTree()); 
    
    +0

    申し訳ありません、OPはその時にあなたに返信していませんでした... ':-('。 – halfer

    関連する問題