2012-01-05 86 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