使用网站中的过滤器来查找产品

时间:2013-01-24 10:39:33

标签: php javascript html mysql filter

我正在开发HTML,PHP,js和MySQL的网站。在这个网站上,客户将能够浏览我工作的公司销售的产品。由于我们有几种不同的产品,我们需要向客户提供过滤结果的能力(想象一下eBay网站)。

网站运行良好,但我在网站开发方面经验不足,所以我无法处理过滤器。我需要将参数传递给php页面,考虑到问题在于,根据用户使用的过滤器数量,我需要传递不同数量的参数。

请考虑以下sql语句作为示例来过滤值:

 SELECT p.code, 
        p.price,
        p.description  
 FROM products p  
 INNER JOIN products_filtervalues pf1  
            ON pf1.productcode = p.code 
            AND pf1.idfilter=1 
            AND pf1.idfiltervalue=45  
 INNER JOIN products_filtervalues pf2  
            ON pf2.productcode = p.code 
            AND pf2.idfilter=2 
            AND pf2.idfiltervalue=6  
 INNER JOIN products_filtervalues pf3  
            ON pf3.productcode = p.code 
            AND pf3.idfilter=4 
            AND pf3.idfiltervalue=7  
 INNER JOIN filtervalues f  
            ON p.idcategory=1 
            AND p.idsubcategory=3 
            AND pf1.idfiltervalue=f.idfiltervalue 
            AND pf1.idfilter=f.idfilter  
 LIMIT 0, 15  

它工作正常,但为了使这项工作变得非常有用,我需要能够插入多个“内部连接”的行,因为内部连接的数量将根据所选的过滤器值的数量而变化。

到目前为止网站运行良好,使用jquery进行PHP和HTML之间的所有通信都运行良好。所以,问题不在于沟通或存在错误,我只需要知道如何解决这种情况。

也许有更好的解决方案,但我现在看不到。可以请有人帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果你必须使用eav模型,一个解决方案是构造伪规范化(和虚拟)数据透视表,然后对其进行查询,如下所示:

 SELECT * FROM eav_hell;
 +-------+-----------+--------+
 | Owner | Attribute | value  |
 +-------+-----------+--------+
 |    10 | COLOR     | BLUE   |
 |    10 | COLOR     | GREEN  |
 |    10 | COLOR     | RED    |
 |    10 | SIZE      | BIG    |
 |    20 | COLOR     | GREEN  |
 |    20 | MEMORY    | 16G    |
 |    20 | MEMORY    | 32G    |
 |    20 | SIZE      | MEDIUM |
 |    30 | COLOR     | BLUE   |
 |    30 | COLOR     | RED    |
 |    30 | MEMORY    | 64G    |
 +-------+-----------+--------+

 SELECT * 
   FROM
      (
        SELECT owner
             , MAX(CASE WHEN attribute = 'color' THEN value END) color
             , MAX(CASE WHEN attribute = 'size' THEN value END) size
             , MAX(CASE WHEN attribute = 'memory' THEN value END) memory
          FROM eav_hell
  GROUP
            BY owner,attribute
      ) x
  WHERE color IN ('blue','green')
     OR size  IN ('small','medium');
 +-------+-------+--------+--------+
 | owner | color | size   | memory |
 +-------+-------+--------+--------+
 |    20 | GREEN | NULL   | NULL   |
 |    20 | NULL  | MEDIUM | NULL   |
 +-------+-------+--------+--------+

 Another solution, more of a quick and dirty hack, is as follows:

 SELECT *
   FROM eav_hell
  GROUP
     BY owner,attribute,value
 HAVING GROUP_CONCAT(CONCAT_WS(',',attribute,value)) IN ('color,blue','size,big')
 ;
 +-------+-----------+-------+
 | Owner | Attribute | value |
 +-------+-----------+-------+
 |    10 | COLOR     | BLUE  |
 |    10 | SIZE      | BIG   |
 |    30 | COLOR     | BLUE  |
 +-------+-----------+-------+