在 Prestashop 中从具有给定属性的产品中获取特定组合

问题描述

我为我的模块构建了一个自定义 sql 查询,以检索具有 id_product 和多个属性 id 的产品的所有组合,但目前,我只能选择一个属性而不是更多,我真的遗漏了一些东西,但还没有找到。

要了解上下文,这是我的查询,以查找产品及其结果的所有组合(颜色和尺寸):

SELECT
    p.id_product,pq.quantity,pa.price AS price_diff,p.price,pai.id_image,pl.name,GROUP_CONCAT(agl.id_attribute_group,':',pal.id_attribute ORDER BY agl.id_attribute_group SEParaTOR ",") as combination_ids,GROUP_CONCAT(pal.name ORDER BY agl.id_attribute_group SEParaTOR ",") as combination
FROM ps_product p
LEFT JOIN ps_product_attribute pa ON (p.id_product = pa.id_product)
LEFT JOIN ps_stock_available pq ON (p.id_product = pq.id_product AND pa.id_product_attribute = pq.id_product_attribute)
LEFT JOIN ps_product_lang pl ON (p.id_product = pl.id_product)
LEFT JOIN ps_product_attribute_combination pac ON (pa.id_product_attribute = pac.id_product_attribute)
LEFT JOIN ps_attribute_lang pal ON (pac.id_attribute = pal.id_attribute)
LEFT JOIN ps_attribute a ON (pal.id_attribute = a.id_attribute) 
LEFT JOIN ps_attribute_group_lang agl ON (a.id_attribute_group = agl.id_attribute_group) 
LEFT JOIN ps_product_attribute_image pai on(pa.id_product_attribute = pai.id_product_attribute)
WHERE pl.id_lang = 1
AND pal.id_lang = 1
AND agl.id_lang = 1
AND p.id_product = 3196 -- My product
GROUP BY pac.id_product_attribute

结果What makes something a “trait object”?

使用单个属性查询(本例中大小为 S):

......................
......................
AND p.id_product = 3196 -- My product
AND agl.id_attribute_group = 9 -- size
AND pal.id_attribute = 761 -- 'S' size for my case
GROUP BY pac.id_product_attribute

enter image description here

但是同时指定尺寸和颜色都没有成功,知道吗?

解决方法

我认为您想要一个 HAVING 子句。要过滤两个属性,逻辑将是:

SELECT ...
FROM ...
WHERE ...
GROUP BY pac.id_product_attribute
HAVING 
    MAX(agl.id_attribute_group = 9 AND pal.id_attribute = 761) = 1
    AND MAX(agl.id_attribute_group = 2 AND pal.id_attribute = 727) = 1

我应该警告您的代码不是有效的聚合查询。您需要在 GROUP BY 子句中添加更多列来修复该缺陷。如果没有看到您的数据,很难确定,但是,对每个表的主键进行一些假设:

GROUP BY 
    p.id_product,pa.id_product_attribute,pac.id_product_attribute,pai.id_image,pq.id  -- if that exists?