20

次のように設定された部品表テーブルがあります:
item - 親

部品表を表示すると、次のように表示されます。

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

私が知っているのは、アイテム 1 から始めているということだけです。アイテム 5 は 11 の親を持つことができます。順番に実行する必要はありません。ツリー内のすべての子ブランチを取得したい。mysqlでこのクエリを実行するにはどうすればよいですか?

4

4 に答える 4

37

2011年10月24日に、誰かがMySQLのツリートラバーサルについてDBAStackExchangeに質問を投稿しました。SQLforMySQLはそれをサポートできません。

その質問への回答に、 3つのストアドプロシージャ(GetParentIDByID、GetAncestry、およびGetFamilyTree)を記述しました。この情報があなたが探しているものを構築するのに役立つことを願っています。

于 2012-06-14T15:03:11.237 に答える
16

Bill Karwinが、MySQL の階層データに関するスライド ショーを投稿しました。データベースの設計を変更できる場合は、データを格納してクエリを実行しやすくする魅力的な方法が他にもいくつかあります。彼がカバーするアプローチは次のとおりです。

  • 隣接リスト
  • パスの列挙
  • ネストされたセット
  • 閉鎖表

スライド 69 には、各方法の長所と短所を示す優れた表があります。そのため、最初にそのスライドを見て、どのアプローチが有効かを確認してから、戻ってその実装方法の詳細を確認することをお勧めします。選択した設計 (隣接リスト) は、提示された 4 つの設計のうち、サブツリーのクエリを困難にする唯一の設計であることに注意してください。

そうは言っても、設計を変更できない場合、または隣接リストに固執したい場合は、Quassnoiの記事「MySQL の階層クエリ」を参照する必要があるというディディエに同意する必要があります。非常にわかりやすい記事で、クエリを効率的に書く方法を説明しています。

于 2012-06-13T22:54:40.263 に答える
7

私の知る限り、MySQLでこれを行うのは簡単ではありません。

これについての良い記事のセットは次のとおりです。

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

于 2012-05-18T08:06:12.873 に答える