0

我正在用 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 之间的所有通信都运行良好。所以,问题不在于通信或存在错误,我只需要知道如何解决这种情况。

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

4

1 回答 1

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  |
 +-------+-----------+-------+
于 2013-01-29T13:23:31.080 回答