php - 获得具有所需属性的产品

标签 php mysql kohana entity-attribute-value

我有一个包含产品和一组属性的类别。 这些属性是“形状”和“直径”。

当我打开一个类别而不应用过滤器时,我会得到具有以下查询的产品:

"SELECT * FROM `products` 
WHERE `category_id` 
IN ('6', '7', '29', '8', '9', '36')"

然后我单击属性“直径”(id = 2),值为“8mm”(id = 4) 我生成以下查询:

"SELECT * FROM `products`
JOIN `products_attributes_values`
ON (`products_attributes_values`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND `products_attributes_values`.`attribute_id` = 2
AND `products_attributes_values`.`value_id` = ('4')"

我得到了我需要的东西,所有珠子都带有“直径 8 毫米” 然后我想更多地过滤我的产品,然后单击属性“形状”(id = 3),值为“圆形”(id = 11) 我什么也没得到,查询如下:

"SELECT * FROM `products` 
JOIN `products_attributes_values`
ON (`products_attributes_values`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND `products_attributes_values`.`attribute_id` = 2
AND `products_attributes_values`.`value_id` = ('4')
AND `products_attributes_values`.`attribute_id` = 3
AND `products_attributes_values`.`value_id` = ('11')"

所以我想要直径为 8 毫米、圆形的珠子,而不是什么都没有。 单独所有过滤器都工作正常。当我想像上面的例子一样混合它们时,它就不起作用了。 我需要如何修改查询才能完成工作?

谢谢。

更新:

我想将一个属性的多个值与另一个属性的一个或多个值组合起来。

例如,我想获得直径(id=2)为8mm(id=4)或直径(id=2)10mm(id=5)和形状(id=3)为圆形(id=11)的珠子) 或形状(id=3) 多面(id=62)

所以最后我想要获得圆形或刻面形状的 8 毫米或 10 毫米珠子。

最佳答案

这 2 个过滤器需要单独处理,因为每个过滤器需要查看 products_attributes_values 表中完全不同的记录。

SELECT * FROM products
WHERE category_id IN ('6', '7', '29', '8', '9', '36')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 2
            AND value_id = '4')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 3
            AND value_id = '11')

来自UAMoto:

它可以工作,但有点慢,所以我像一个人告诉我的那样使用了连接别名:

"SELECT * FROM `products`
JOIN `products_attributes_values` AS pav1
ON (`pav1`.`product_id` = `products`.`id`)
JOIN `products_attributes_values` AS pav2
ON (`pav2`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND (`pav1`.`attribute_id` = '2' AND `pav1`.`value_id` = '4')
AND (`pav2`.`attribute_id` = '3' AND `pav2`.`value_id` = '11')"

更新了属性组合的查询:

SELECT * FROM products
WHERE category_id IN ('6', '7', '29', '8', '9', '36')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 2
            AND value_id IN ('4', '5'))
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 3
            AND value_id IN ('11', '62'))

SELECT *
FROM `products`
    JOIN `products_attributes_values` AS pav1 ON (`pav1`.`product_id` = `products`.`id`)
    JOIN `products_attributes_values` AS pav2 ON (`pav2`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND (`pav1`.`attribute_id` = '2' AND `pav1`.`value_id` IN ('4', '5'))
AND (`pav2`.`attribute_id` = '3' AND `pav2`.`value_id` IN ('11', '62'))

关于php - 获得具有所需属性的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994218/

相关文章:

select - Kohana3 ORM sum() 等效项

mysql - 使用 ORDER BY 同时仍然保持使用索引

php - Kohana 中这个常数的意义何在?

mysql - 如何在 Kohana 3.2 查询生成器中使用 MySQL "REPLACE"函数?

php - 如何从 php 中的 FORM 操作获取响应

mysql - mySQL 中的奇怪 Ascii 字符。需要查询才能删除

MySQL IF 以数字开头做 X,否则做 Y

php - 多个 MySQL 数据库的事件调度程序

php - 我可以通过 socket_sendmsg (sendmsg) 将 TCP 套接字资源传递给 AF_UNIX 本地套接字吗?如果可以,如何传递?

php - 如果字符串包含正斜杠