7

ツリー構造のような階層関係に基づいて製品が分類されたテーブルがあります。カテゴリとすべてのサブカテゴリを任意のレベルで選択する必要があります。下の図を参照してください。

ここに画像の説明を入力

たとえば、id=11 を渡してクエリを実行すると、(19,20,21,22,23,24,25,26) が返されるという SQL ステートメントが必要です。

4

4 に答える 4

11

階層データを MySQL に格納するには、いくつかの方法があります。4 つのオプションを示すBill Karwin のプレゼンテーションをご覧ください。

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

階層データを格納するために隣接リストモデルを使用していますが、残念ながら、これはサブツリーのクエリに選択できる最も難しいモデルです。

ネストされたセットのクエリ サブツリー

オプションは次のとおりです。

  • 別のモデルに変更してください。
  • クエリを n レベルの深さに制限します。
  • ストアド プロシージャを使用して、再帰的にクエリを実行します。詳細については、Quassnoi の一連の記事 - MySQL の階層クエリ を参照してください。
于 2012-07-08T11:46:55.910 に答える
1
SELECT * FROM `Products` 
WHERE parentId IN (
    SELECT id FROM `Products` 
    WHERE parentId = 11)

注: 階層が 2 レベルよりも深い場合、これは機能しません。

于 2012-07-08T11:46:12.710 に答える
1

データ構造を少し変更して、計算された系統列を含めることができますか。一般的な概念を示す素晴らしい記事があります (データベースの種類は無視してください)。

基本的に、計算されたリネージ列には、たとえば親のリストが含まれている必要があります

項目 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/
于 2012-07-08T11:47:22.373 に答える
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)))
于 2012-07-09T05:49:03.283 に答える