この質問はおそらくすでに何千回も聞かれているような気がするので、答えられていたら申し訳ありません。もしそうなら、誰かが私に正しい投稿/リンクを教えてもらえますか?
私がやろうとしているのは、サイトのファセット ナビゲーションを構築することです。これは MySQL を使用しており、私が使用しているテーブルの大まかなスケッチは次のとおりです。
製品: - ID - 題名 - 説明
属性: - 製品番号 - 名前 - 価値
カテゴリ: - ID - 名前
products_to_categories: - 製品番号 - カテゴリ ID
私がやりたいことは、カテゴリにいるときに利用可能な属性のリストを表示し、それらの属性ごとに 1 つ以上の値を選択できるようにすることです。例として、Office Depot の次のページを見てください: http://www.officedepot.com/a/browse/binders/N=5+2177/
これまで、複数の属性をフィルタリングするために多くの結合を使用してきました。
SELECT products.*、a_options.* FROM products_to_categories AS PC、製品、 attributes AS a_options, /* 引き続き改良できる属性/値のペアのリスト */ attributes AS a_select1 /* 最初に選択された属性 */ attributes AS a_select2 /* 2 番目に選択された属性 */ ... WHERE pc.category_id = 1 AND products.id = pc.product_id AND a_options.product_id = products.id AND a_options.name != '色' AND a_options.name != 'サイズ' AND a_select1.product_id = products.id AND a_select1.name = 'Color' AND (a_select1.value = '青' OR a_select1.value = '黒') AND a_select2.product_id = products.id AND a_select2.name = 'Size' AND a_select2.value = '8.5 x 11'
基本的に、 と を使用しa_options
て適用したフィルターのサブセットである製品のすべての属性を返します。したがって、Office Depot のバインダーの例を使用する場合、色に青または黒を選択し、サイズに「8.5 x 11」を選択した後、使用可能なすべての属性を表示したいと考えています。a_select1
a_select2
次に、PHP コードを使用して重複を削除し、結果の属性を次のような配列に配置します。
属性[名前1] = (val1、val2、val3、...) 属性[名前2] = (val1、val2、val3、...)
クエリを高速化したり、より効率的に記述したりする方法はありますか? 属性テーブルの名前と値 (およびすべての ID 番号) にインデックスを設定しました。しかし、誰かがいくつかの属性を選択すると、クエリの実行が遅くなります。
事前にご協力いただきありがとうございます、
Sridhar