2012-01-05 15 views
0

私がまとめている電子商取引パッケージに商品を表示するアプローチに関して、簡単な質問があります。私が直面している問題は、サイトの訪問者に検索を絞りたいということです。PHP、MySQLの電子商取引フィルタリングのアプローチ

例えば、ユースケースは次のようになります。ビジターは現在、(。例えば夏コレクションは)製品のシーズンを閲覧している

  1. 彼/彼女はその後、カテゴリやブランドでフィルタリングすることができるはずですその季節には、例えば、彼らは衣服の豊かさからズボンを見たいと思うかもしれません。

問題、私は対面は、これらの要因の3つのすべてに一致する製品を見つけるために、単一のSQLクエリを実行すると、(その製品は、夏のコレクションであるパンツのペアで、服によって作られたということですミリアンペア豊富)。これを過度に困難にするのは、製品が複数のカテゴリと季節になる可能性があるということです。正しい結果を得るためには、狂った量の結合が必要になります。

次のように私のデータベース構造は次のとおりです。

product -> product_category <- category 
product -> product_season <- season 
product <- brand (a product can only be made by one brand) 

http://lucene.apache.org/solr/(あなたは大きなカタログを持っている場合、あなたは、Apache Solrのを使用する方がよいかもしれません

+0

テーブル構造は曖昧です。 product_seasonとproduct_categoryが既に商品表の一部である場合、なぜ、まったく参加する必要がありますか?私は彼らがcategory_idとseason_idまたは何かを共有していると仮定しています。私はその前提の下で答えを書くつもりです。 – James

+0

ごめんなさい、スケッチーなERDであると思われました。 product_categoryとproduct_seasonは、製品とそれぞれの結合テーブル(カテゴリやシーズンなど)間のブリッジングエンティティを表します。それを少しクリアすることを願っています。 –

+0

それは私が考えていたものです。私は彼らが同じテーブルの両方のフィールドであると仮定していますか?よく分かりません。 – James

答えて

1

...誰かがこの上で彼らの知恵を共有することを願って)。そうでなければ、いくつかのアプローチがあります。あなたがオーバーヘッドとまっすぐなSQLを必要としない

が合理的にうまく機能しますが、その非常識ではありません。

SELECT product.* 
FROM product 
LEFT JOIN product_category 
LEFT JOIN category 
LEFT JOIN product_season 
LEFT JOIN season 
WHERE season = ? AND category = ? 

を別の方法として、あなたが返される行数が気に入らない場合は、集約することができますその後、製品テーブルにカテゴリと季節(新しい列)、ものを見つけるために、クエリのように使用します。

SELECT product.* 
FROM product 
where product.categories like '% category %' 
    and product.seasons like '% season %' 
+0

これは私が探していたものに少し似ています...私はあなたの最初の提案に応じて複数の結合をクエリ構築のメカニズムとしてActive Recordを使用しているので、恐れがあります。しかし、集計の考え方は、製品を検索する際にクイックルックアップインデックスを提供するため、最も効果的です。 –

+0

DBMSでフィールドのインデックスを正しく作成してください。 – amccausl

+0

ok ...すべての私の主キーが索引付けされています。また、検索する唯一の列である製品名。そして明らかにあなたが提案していた集計列。あれは正しいですか? –

0
Select product.* From product 
    Left Join product_category On (product.product_id = product_category.product_id) 
    Left Join product_season On (product.product_id= product_season.product_id) 
    Left Join brand On (product.product_id = brand.product_id) 
    Where product_category.category_id = '$catId' 
    And product_season.season_id = '$seasonId' 
    And brand.brand_id = '$brandId' 
     Order By product.product_name 

[OK]を、これはproductproduct_category、を想定しています、brandseasoncategoryはすべて表です。 seasoncategoryテーブルのIDは、検索対象をフィルタリングするために使用しているものから直接渡して、これらのテーブルを結合する必要はありません。

+0

返信ありがとうございます...私はこのアプローチを検討していますが、クエリを作成するためにアクティブレコードを使用しているという事実は、これを私にとってはあまり保守できないものにしています。その場でページネーションと並べ替えを追加する必要があります。また、クエリを構築するために文字列をつなぎ合わせる必要もありません。 –

関連する問題