2012-01-05 85 views
0

關於在我放在一起的電子商務軟件包上顯示產品的方法,我有一個簡短的問題。我面臨的問題是我希望網站的訪問者縮小搜索範圍。PHP,MySQL電子商務過濾方法

例如,使用情況是:

  1. 一個遊客正在瀏覽的產品賽季
  2. 他/她應該然後能夠通過品類和品牌過濾(如夏季集合。)在那個季節內,例如他們可能會決定他們只想看到衣服豐滿的褲子。

的問題,我是個面對的是,爲了做一個SQL查詢來發現所有這三個因素(所以該產品是在夏季收集相匹配的產品,是一條褲子和衣服做嘉豪)。這使得這個過於困難的事情是,產品可以在多個類別和季節。因此,爲了獲得正確的結果,需要加入瘋狂的金額。

我的數據庫結構如下:

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

希望有人可以在此分享他們的智慧......

+0

您的表格結構不盡相同。如果product_season和product_category已經是產品表的一部分,那麼爲什麼您需要加入?我假設他們正在分享category_id和season_id或其他內容。我會在這個假設下寫一個答案。 – James 2012-01-05 04:05:52

+0

嘿,對不起,這是一個粗略的ERD。 product_category和product_season表示產品和相應加入表(例如類別或季節)之間的橋接實體。希望能夠清楚一點。 – 2012-01-05 04:07:58

+0

這就是我的想法。我假設他們在兩個表中都是相同的字段?我不確定。 – James 2012-01-05 04:10:12

回答

1

如果你有一個大的目錄,你可能會更好使用Apache Solr實現(http://lucene.apache.org/solr/ )。否則,有幾種方法。

你不需要的開銷和直接的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作爲查詢構建機制,因此根據您的第一個建議進行多個聯接很困難。然而,聚合想法是最好的,因爲它在搜索產品時提供了快速查找索引。 – 2012-01-05 04:11:37

+0

確保您在數據庫管理系統中正確地爲您的字段建立索引。 – amccausl 2012-01-05 04:16:56

+0

好的...我所有的主鍵都被編入索引。以及任何搜索的唯一列的產品名稱。然後顯然是你建議的總計專欄。那是對的嗎? – 2012-01-05 04:18:20

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 

好吧,這是假設productproduct_categoryproduct_seasonbrand,season,category都是表格。您應直接通過seasoncategory表中的ID來傳遞過濾搜索的內容,以便您不必加入這些表。

+0

感謝您的回覆......我一直在考慮這種方法,但事實是我使用Active Record來構建我的查詢,這使得我不能很好地維護。我不得不在現場添加分頁和排序,我不想最終將字符串連接在一起以構建查詢。 – 2012-01-05 04:16:47