ツリー構造のような階層関係に基づいて製品を分類した表があります。どのレベルでもカテゴリとすべてのサブカテゴリを選択する必要があります。階層関係のSQL
例えば:下記の画像を参照してください。私は、ID = 11を渡してクエリを実行すると、それは私に(19,20,21,22,23,24,25,26)
ツリー構造のような階層関係に基づいて製品を分類した表があります。どのレベルでもカテゴリとすべてのサブカテゴリを選択する必要があります。階層関係のSQL
例えば:下記の画像を参照してください。私は、ID = 11を渡してクエリを実行すると、それは私に(19,20,21,22,23,24,25,26)
SELECT * FROM `Products`
WHERE parentId IN (
SELECT id FROM `Products`
WHERE parentId = 11)
NOTEを返すことに私は、SQL文をしたい:これがあれば動作しません。あなたの階層は2つのレベルより深いです。
heirarchicalデータをMySQLに保存する方法はいくつかあります。 4つのオプションを示すBill Karwinのpresentationを調べてください。
あなたは階層的データを格納するため隣接リストモデルを使用しているが、残念ながら、これは最も難しいですモデルを使用して、サブツリーを照会することができます。
次のオプションがあります。異なるモデルへ
データ構造を少し変更して、計算されたライン列を含めることはできますか? 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/
これは厄介で、あなたはどのように深い階層である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)))