3

初めての投稿はこちら!これは賢明になる場所のようです;)

私は現在、PHPの助けを借りてMysqlデータベースにデータを保存するためのMPTT(Modified Preorder Tree Traversal)アプローチを試す初めての試みで、いくつかのテストの最中です。

ただし、特定の親を持つ特定のレベルのすべてのリスト要素を取得するための最もパフォーマンス指向の方法を見つけようとしています。

入力した親の名前が「Bilar」の場合、下の画像から Saab と Chrysler のカテゴリを取得することになります。(これは、スウェーデン語で車を意味します。それがあなたの最強の側面ではない場合;))

画像を投稿できないので、フローチャートへのリンクを次に示します。 http://www.phpsidan.nu/files/mptt/mptt1.png

現在、私はやりたいことをするために2つのクエリを実行しており、レベルを計算して同じレベルの他のすべての要素を吐き出すためのかなりの量のコードを実行しています。

これを行うためのより良い方法はありますか?うまくいけば1つのクエリのみを使用することでしょうか?

どうもありがとう!

4

2 に答える 2

1

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ には、入れ子集合に関する情報とクエリの例があります

NSで直接の子を取得するのは複雑であるため、「左」および「右」ポインタとともに明示的なparent_idを格納することを好む人もいます。

于 2009-10-28T16:40:27.473 に答える
1

これは最適化できると確信していますが、列「name」、「lft」、および「rgt」があると仮定すると、次のように「Bilar」のレベル 2 兄弟が得られます。

SELECT node.name,                                                                                                                                     
       node.lft AS sort,                                                                                                                                                                                                                                                               
       (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth                                                                        

FROM car AS node,                                                                                                                                  
     car AS parent,                                                                                                                                
             car AS sub_parent,                                                                                                                            
             ( SELECT node.name, (COUNT(parent.name) - 1) AS depth                                                                                          
                 FROM car AS node,                                                                                                                         
                      car AS parent                                                                                                                        
                WHERE node.lft BETWEEN parent.lft AND parent.rgt                                                                                            
                  AND node.name = "Bilar"                                                                                                                       
             GROUP BY node.name                                                                                                                             
             ORDER BY node.lft) AS sub_tree

WHERE node.lft BETWEEN parent.lft AND parent.rgt                                                                                                     
  AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt                                                                                             
  AND sub_parent.name = sub_tree.name

GROUP BY node.name HAVING depth <= 2                                                                                                                 
ORDER BY node.lft
于 2010-02-07T20:39:51.700 に答える