购物车 - 多个属性值

时间:2014-12-26 11:19:05

标签: php mysql pdo

我有以下产品和购物车的表格:

// 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

所以:

  • 客户需要黑色尺寸的产品1
  • 客户希望产品1采用红色尺寸M

产品可以包含多个属性值。

通过使用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和无限属性(可能只有颜色和大小,但不是每个产品都有属性)。

1 个答案:

答案 0 :(得分:0)

"古典" SQL方法要求您在每个属性过滤器上执行JOINsub-query。 因此,如果您需要通过5个过滤器(属性值)查找产品,则需要创建一个包含5个JOIN或子查询的SQL查询。与问题相同,您发布了指向。

的链接

根本不可扩展,您可能会猜到。

所以,我想提供一个不同的,但有点" haskish"办法。 您可以在products_attribute_values表格上进行查询,并获得如下对象:

ProductIDHow 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