3

私はそのような隣接リストモード構造を持っています

ここに画像の説明を入力してください

このクエリによって

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

そのような結果を得る

ここに画像の説明を入力してください

しかし、私はそのような結果を得たいのですが、それを行うオプションがあります

ここに画像の説明を入力してください

前もって感謝します

4

4 に答える 4

1

興味深い点として、作業が多すぎて「答え」とは異なる可能性があるため、「変更された事前注文ツリートラバーサル」の概念を検討することをお勧めします。GijsVanTulderによる素晴らしい説明があります。

階層データを格納するためのテーブル上の追加のフィールドと、その構造を維持するための追加のコードが必要になりますが、リレーショナルデータベースエンジンでのツリー構造の処理がはるかに簡単になります。

基本的に、私たちが木と一緒に保存する通常のように、私たちはaと値parent_idも保存します。正しく入力されると、ノードの深さに関係なく、とのすべてのノードを選択するだけで、「ノードのすべての子」を簡単に取得できます。leftrightnode.left > parent.leftnode.right < parent.right

于 2012-05-08T13:12:52.970 に答える
1

UNIONが必要です。それぞれのレベルで、エントリの重複を削除することをお勧めします。また、Webアプリのようにユーザーに提示する場合は、「NULL」値を含める必要はありません。

select L1.Category_ID,
       L1.name, 
       "1" as HierarchyLevel, 
       count( L2.Category_ID ) as NextLevelCount
   from Category L1
        LEFT JOIN Category L2
           on L1.Category_ID = L2.Parent
   where L1.name = "ELECTRONICS"
   group by L1.Category_ID
UNION
select L2.Category_ID,
       L2.name, 
       "2" as HierarchyLevel,
       count( L3.Category_ID ) as NextLevelCount
   from Category L1
        JOIN Category L2
           on L1.Category_ID = L2.Parent
           LEFT JOIN Category L3
              on L2.Category_ID = L3.Parent
   where L1.name = "ELECTRONICS"
   group by L2.Category_ID
UNION
select L3.Category_ID,
       L3.name, 
       "3" as HierarchyLevel,
       count( L4.Category_ID ) as NextLevelCount
   from Category L1
        JOIN Category L2
           on L1.Category_ID = L2.Parent
           JOIN Category L3
              on L2.Category_ID = L3.Parent
              LEFT JOIN Category L4
                 on L3.Category_ID = L4.Parent
   where L1.name = "ELECTRONICS"
   group by L3.Category_ID
UNION
select L4.Category_ID,
       L4.name, 
       "4" as HierarchyLevel,
       1 as NextLevelCount
   from Category L1
        JOIN Category L2
           on L1.Category_ID = L2.Parent
           JOIN Category L3
              on L2.Category_ID = L3.Parent
              JOIN Category L4
                 on L3.Category_ID = L4.Parent
   where L1.name = "ELECTRONICS"

これは明らかに4つのレベルに固定されていますが、それらを1つのリストに統合しますが、提示したとおりに重複することはありません。また、参照のために階層レベルにも取り組みました。各レベルのカウントを取得するには、次のレベルへの左結合を実行する必要があります。そうしないと、取得しようとしているレベルで可能なアイテムを見逃しますが、他のアイテムは内部結合のままにする必要があります。

あなたが製品を扱っているなら、私は、4レベルの深さの後で彼らが何かを見つけることができないなら、より大きな問題があると思います:)

于 2012-05-08T12:54:27.390 に答える
1

残念ながら、現在の設定でカテゴリのサブカテゴリの数を数えることは困難です。追加するの量によってメニューの深さが制限されるだけでなく、LEFT JOINどのカテゴリーが 1 レベルより深いカテゴリーに直接リンクされているかを判別することも不可能です。

この問題に対する優れた解決策はnested set、メニューに構造を使用することです。詳細については、こちらを参照してください。mysql でこれを行う方法の詳細については、こちらを参照してください。

于 2012-05-08T08:18:28.770 に答える
0

次のようなことができます。

SELECT name FROM category WHERE name = 'ELECTRONICS'

UNION

SELECT t2.name FROM t2 INNER JOIN category as t1 ON t2.parent = t1.category_id WHERE t1.name = 'ELECTRONICS'

UNION

SELECT t3.name FROM t3 INNER JOIN category as t1 ON t3.parent = t1.category_id WHERE t1.name = 'ELECTRONICS'

UNION

SELECT t4.name FROM t4 INNER JOIN category as t1 ON t4.parent = t1.category_id WHERE t1.name = 'ELECTRONICS'
于 2012-05-08T08:15:13.890 に答える