ツリー構造のような階層関係に基づいて製品が分類されたテーブルがあります。カテゴリとすべてのサブカテゴリを任意のレベルで選択する必要があります。下の図を参照してください。
たとえば、id=11 を渡してクエリを実行すると、(19,20,21,22,23,24,25,26) が返されるという SQL ステートメントが必要です。
階層データを MySQL に格納するには、いくつかの方法があります。4 つのオプションを示すBill Karwin のプレゼンテーションをご覧ください。
階層データを格納するために隣接リストモデルを使用していますが、残念ながら、これはサブツリーのクエリに選択できる最も難しいモデルです。
オプションは次のとおりです。
SELECT * FROM `Products`
WHERE parentId IN (
SELECT id FROM `Products`
WHERE parentId = 11)
注: 階層が 2 レベルよりも深い場合、これは機能しません。
データ構造を少し変更して、計算された系統列を含めることができますか。一般的な概念を示す素晴らしい記事があります (データベースの種類は無視してください)。
基本的に、計算されたリネージ列には、たとえば親のリストが含まれている必要があります
項目 26 には以下が含まれます\11\
あなたが持つことができるサブアイテムがあれば
\11\subitem\
次に、リネージ テーブルで like チェックを実行するだけで、反復検索よりもはるかに高速になり、ストアド プロシージャまたはトリガーを使用して作成できます。
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)))