2012-05-18 15 views
20

を作るために行を横断するMySQLのクエリを使用して、私はこのように設定されている材料テーブルの法案があります
アイテム - 私は材料の法案はそれということで表示するとき、親再帰ツリー

最終結果をこのように表示されます。

item 1 - parent 0  
    item 2 - parent 1  
    item 3 - parent 1  

最終的な結果はまた、このようなマルチレベルのようになります。

item 3 - parent 0  
    item 4 - parent 3  
    item 76 - parent 3  

そして、それは無限に行くことができます:

item 76 - parent 0  
    item 46 - parent 76  

item 46 - parent 0  
    item 25 - parent 46 

今、私はどちらかだけのデータベースから1つのレベルを取得:

SELECT * FROM bom WHERE parentId = $itemId (shorthand)

するか、テーブルからすべての行を引くと、私は必要なものだけを整理するために私の再帰関数を使用し、しかし、これは私が10行しか必要としないので明らかに非効率ですが、私は10,000レコードを引っ張ります。再帰関数の出力は、ちょうどこのようなツリーを作成します。

item 1 
    item 2 
    item 3 
     item 4 
     item 76 
     item 46 
      item 25 

私が知っているすべては私が11の親を持つことができます項目1項目5で始めていますということです。彼らは連続して行く必要はありません。私はツリー内のすべての子ブランチを取得したい。どうすればmysqlでこのクエリを実行できますか?

答えて

35

2011年10月24日に、誰かがquestion in the DBA StackExchange about tree traversal in MySQLを投稿しました。 MySQL for SQLはそれをサポートしていません。

私はmy answer to that questionに3(3)ストアドプロシージャ(GetParentIDByID、GetAncestryとGetFamilyTree)を書き上げました。この情報があなたが探しているものを構築するのに役立つことを願っています。

+0

優れた手順。しかし、 'SELECT id、GetFamilyTree(id)FROM pctable;はエラーを投げます:_ERROR 1292(22007):切り捨てられた不正なDOUBLE値: '4,5'_。私はそれをデバッグしようとしましたが、無駄でした。何か考えてもらえますか?ありがとう – idok

7

AFAIK、それはMySQLでこれを行うことは自明ではありません。ここで

はそれについての記事の良いセットです:

http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

+0

私はそれが基本的な質問ではないことを知っていました。 :P記事のおかげで。私は間違いなくそれをチェックします。 – phpmeh

15

Bill Karwin MySQLでheirarchical dataについてのスライドショーを掲載しています。データベース設計を変更することがオプションである場合は、クエリを簡単にするためにデータを格納する魅力的な方法がいくつかあります。彼はカバーのアプローチは以下のとおりです。

  • 隣接リスト
  • パス列挙
  • は入れ子になったが、
  • 閉鎖表

スライド69は、それぞれの方法の長所と短所を示した素敵なテーブルを持って設定します。最初にそのスライドを見て、どちらのアプローチが効果的かもしれないかを見てから、やり直して、実装方法の詳細を見てみましょう。選択したデザイン(隣接リスト)はの4つのデザインのうちの1つで、サブツリーを照会するのが難しいことに注意してください。

あなたがデザインを変更できない場合、または隣接リストを保持したい場合は、Quassnoiの記事"Hierarchical queries in MySQL"を見てくださいとDidierに同意する必要があります。非常に明確な記事であり、クエリを効率的に記述する方法について説明しています。

+2

素晴らしいリソース。そのような情報を得るために奨励金を出しました。ありがとうございました! – phpmeh

関連する問題