ほとんどの場合、入れ子集合を実行することをお勧めします。設定するのは少し難しいですが、クエリを非常に簡単にします。したがって、カテゴリの親の代わりに、2つの列(lft
)があります。 およびrgt
。左と右は基本的にカテゴリの境界です。アイテムのカテゴリIDがこれらの値の間にある場合、そのカテゴリの子であることがわかります。
+----+---------------+-----+------+
| id | category name | lft | rgt |
+----+---------------+-----+------+
| 1 | cars | 1 | 24 |
+----+---------------+-----+------+
| 2 | bmw | 2 | 3 |
+----+---------------+-----+------+
| 5 | audi | 4 | 23 |
+----+---------------+-----+------+
| 6 | 100 | 5 | 6 |
+----+---------------+-----+------+
| 7 | 80 | 7 | 8 |
+----+---------------+-----+------+
| 8 | A4 | 9 | 22 |
+----+---------------+-----+------+
| 9 | TDI | 10 | 11 |
+----+---------------+-----+------+
| 10 | Quatro | 12 | 21 |
+----+---------------+-----+------+
| 11 | Black | 13 | 18 |
+----+---------------+-----+------+
| 12 | White | 19 | 20 |
+----+---------------+-----+------+
| 13 | 2 doors | 14 | 15 |
+----+---------------+-----+------+
| 14 | 5 doors | 16 | 17 |
+----+---------------+-----+------+
次に、車のカテゴリのアイテム数を取得するには、次のように非常に簡単に行うことができます。
SELECT categories.name, items.id, items.category_id, items.name
FROM categories
LEFT JOIN items
ON (items.category_id BETWEEN categories.lft AND categories.rgt)
WHERE categories.category_name = 'cars'
もちろん、category_name
の値を変更するだけです。 任意のカテゴリのアイテムを取得します。
申し訳ありませんが、ここにアップロードしたときに何らかの理由で画像が回転しましたが、カテゴリを円で描いてから線に番号を付けると、左右の値がわかります。
他のカテゴリーを取得するために外挿できると思ったので、私は車だけをしました。
したがって、次のようにカテゴリを書き出す場合:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
次に、括弧に数字のラベルを付けることができます:
Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]
または、ツリーとしてグラフ化する場合は、次のようにラベルを付けることができます。この場合、左端のノードに番号を付け、すべての子にラベルを付けた場合にのみ右ノードにラベルを付けます。