我正在开发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之间的所有通信都运行良好。所以,问题不在于沟通或存在错误,我只需要知道如何解决这种情况。
也许有更好的解决方案,但我现在看不到。可以请有人帮助我吗?
答案 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 |
+-------+-----------+-------+