次のカテゴリテーブルがあります。
- カテゴリID
- 親カテゴリーID
- 種別名
および項目テーブルには次のものがあります。
- アイテムID
- カテゴリID
- 項目名
私はMySQLを使用しています。カテゴリ ID を指定して、カテゴリ内のアイテムの数を返すクエリを作成したいと考えています。クエリは、指定されたカテゴリのすべてのサブカテゴリ内のすべてのアイテムの合計数を返す必要があります。
これが理にかなっていることを願っています..正しい命名法を使用していない場合は申し訳ありません.
次のカテゴリテーブルがあります。
および項目テーブルには次のものがあります。
私はMySQLを使用しています。カテゴリ ID を指定して、カテゴリ内のアイテムの数を返すクエリを作成したいと考えています。クエリは、指定されたカテゴリのすべてのサブカテゴリ内のすべてのアイテムの合計数を返す必要があります。
これが理にかなっていることを願っています..正しい命名法を使用していない場合は申し訳ありません.
そのスキーマにどれくらいこだわっていますか? これは「隣接リスト」と呼ばれ、概念的には十分に単純ですが、実際にはいくつかの欠点があります。最も重要なのは、すべての子孫を照会できないことです。
これを見て、ツリーを表現する別の方法がより適切に機能するかどうかを検討してください。
あなたが言うように、カテゴリには2つのレベルしかない場合、単純な結合/エイリアスクエリはうまく機能します. 任意の深さを許可している場合は、派手な再帰クエリや隣接セットなどを使用する必要があります。
アイテムを「下位」カテゴリにのみ添付できると仮定すると、次のようなもので必要な結果が得られるはずです。
SELECT top.categoryID, top.categoryName, bottom.categoryID, bottom.categoryName,
COUNT (items.itemID)
FROM categories AS top
LEFT JOIN categories AS bottom ON top.categoryID = bottom.parentCategoryID
LEFT JOIN items ON bottom.categoryID = items.categoryID
WHERE (bottom.categoryID = $your_category)
GROUP BY top.categoryID, bottom.categoryID
最上位のカテゴリのみを表示する必要がある場合は、WHERE
句を適宜変更してください。
Jeff Degeが参照しているドキュメントで説明されている代替アプローチを検討している場合は、現在の隣接リスト ツリー構造に対して:
入れ子になったセットは、頻繁に読み取られるがほとんど変更されないデータに対して非常に高速です (読み取りには SQL とインデックスが使用されBETWEEN
ます。多くの既存のレコードを更新する必要があるため、変更にはコストがかかる可能性があります) 。インデックスとクエリを使用するときの読み取りパフォーマンス(少なくとも私の知る限り MySQL の場合)、挿入操作の優れたパフォーマンス、およびカテゴリを別のカテゴリに移動するときの許容可能なパフォーマンス。LIKE '[path]%'
私は個人的に、データベース ID をパス要素としてパス列挙を使用し.
、要素を区切るためのドット (祖先パス1.2.3.
など) を使用しているプロジェクトを持っています。
特に多数のカテゴリ (数千以上) がある場合は、これらのアプローチを比較するために独自のベンチマークを実施することをお勧めします。
もちろん可能ですが、あまり効率的ではありません。ネストされたセット構造を使用する必要があります: http://intelligent-enterprise.informationweek.com/001020/celko1_1.jhtml;jsessionid=AFUXE0ZF4PTNXQE1GHPSKH4ATMY32JVN
気に入らない場合は、こちらをご覧ください: http://explainextended.com/2010/04/18/hierarchical-query-in-mysql-limiting-parents/