2012-07-08 15 views
5

ツリー構造のような階層関係に基づいて製品を分類した表があります。どのレベルでもカテゴリとすべてのサブカテゴリを選択する必要があります。階層関係のSQL

enter image description here

例えば:下記の画像を参照してください。私は、ID = 11を渡してクエリを実行すると、それは私に(19,20,21,22,23,24,25,26)

答えて

1
SELECT * FROM `Products` 
WHERE parentId IN (
    SELECT id FROM `Products` 
    WHERE parentId = 11) 

NOTEを返すことに私は、SQL文をしたい:これがあれば動作しません。あなたの階層は2つのレベルより深いです。

9

heirarchicalデータをMySQLに保存する方法はいくつかあります。 4つのオプションを示すBill Karwinのpresentationを調べてください。

  • 隣接リスト
  • パス列挙
  • ネストセット
  • 閉鎖表

あなたは階層的データを格納するため隣接リストモデルを使用しているが、残念ながら、これは最も難しいですモデルを使用して、サブツリーを照会することができます。

nested sets query subtree

次のオプションがあります。異なるモデルへ

  • 変更。
  • クエリをnレベルまで制限します。
  • ストアドプロシージャを使用して、再帰的にクエリを実行します。詳細については、Quassnoiの一連の記事(Hierarchical queries in MySQL)を参照してください。
1

データ構造を少し変更して、計算されたライン列を含めることはできますか? great articleがあります(データベースタイプを無視してください)。

基本的には、あなたの計算された行数の列を使用すると、その後

\11\subitem\

を持つことができますが、サブアイテムを持っていた場合\11\

が含まれます例

項目26のためにそれに両親のリストが含まれている必要がありますリネージテーブルのようなチェックを行うだけで、反復検索よりもはるかに高速で、格納されたprocやトリガを使用して作成することもできます。

Node ParentNode EmployeeID Depth Lineage 
100  NULL   1001   0 /
101  100   1002   1 /100/ 
102  101   1003   2 /100/101/ 
103  102   1004   3 /100/101/102/ 
104  102   1005   3 /100/101/102/ 
105  102   1006   3 /100/101/102/ 
0

これは厄介で、あなたはどのように深い階層であるnがある場合、n個の組合を行う必要があるでしょうが、それは動作するはずです:

SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId = 11) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId = 11)) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId IN (
      SELECT id FROM `Products` WHERE parentId = 11)))