我有以下产品和购物车的表格:
// PRODUCT TABLES
Products:
id | Product_value
-----------------------
1 | Product 1
Attributes:
id | Attribute_value
-----------------
1 | Color
2 | Size
Attribute_values:
id | Attribute_id | Value_value
---------------------------------
1 | 1 | Black
2 | 1 | Red
3 | 1 | Blue
4 | 2 | S
5 | 2 | M
6 | 2 | L
7 | 2 | XL
Product_attribute_values
Product_id | Attribute_id | Value_id
--------------------------------------
1 | 1 | 1
1 | 1 | 2
1 | 1 | 3
1 | 2 | 4
1 | 2 | 5
1 | 2 | 6
1 | 2 | 7
// DB TABLES
Cart:
id | product_id | number_value
----------------------------------
1 | 1 | 1
2 | 1 | 1
Product_attribute_value:
Cart_id | attribute_id | value_id
--------------------------------------
1 | 1 | 1
1 | 2 | 4
2 | 1 | 2
2 | 2 | 5
所以:
产品可以包含多个属性值。
通过使用AJAX-> JSON在购物车中添加产品,我有以下数据:
- productid
- number
- attribute= array( // example: color
attribute_id
value_id
)
- attribute= array( // example: size
attribute_id
value_id
)
我可以通过哪个查询(PDO)查看此组合是否已存在?如果存在,我想更改此产品的数量
在' How to find all the products with specific multi attribute values'他们使用EXISTS。 我如何使用PDO和无限属性(可能只有颜色和大小,但不是每个产品都有属性)。
答案 0 :(得分:0)
"古典" SQL方法要求您在每个属性过滤器上执行JOIN
或sub-query
。
因此,如果您需要通过5个过滤器(属性值)查找产品,则需要创建一个包含5个JOIN或子查询的SQL查询。与问题相同,您发布了指向。
根本不可扩展,您可能会猜到。
所以,我想提供一个不同的,但有点" haskish"办法。
您可以在products_attribute_values
表格上进行查询,并获得如下对象:
ProductID
,How many attributes/filters this products match
这是一个查询:
SELECT product_id, COUNT(*) AS `attributes_matching` FROM Product_attribute_values
WHERE
Attribute_id1=Value1 // example: color
AND
Attribute_id2=Value2 // example: size
AND
Attribute_id3=Value3 // example: for-man/women/kid
AND
Attribute_id4=Value4 // example: Manufacturer
AND
Attribute_id5=Value5 // example: Material
GROUP BY product_id
通常,您可以使用此attributes_matching
值作为搜索排名值,您可以排序&过滤它。
例如,在上面的示例中,如果没有与所有5个过滤器匹配,则可以显示与4个过滤器匹配的产品。
如果您想获得与所有5个过滤器匹配的产品(严格过滤),您只需在查询末尾添加HAVING
:
...
AND
Attribute_id5=Value5 // example: Material
GROUP BY product_id
HAVING attributes_matching=5 // 5 - number of filters in this case