我有SQL可以统计具有特定属性的产品。我在产品过滤器中使用它。 SQL很长,但这是主要部分:
SELECT COUNT(products.id) as products_count, property_items.description, property_items.id as id
FROM property_items
INNER JOIN product_properties ON property_items.id = product_properties.property_item_id
INNER JOIN products ON product_properties.product_id
INNER JOIN product_properties pp ON products.id = pp.product_id AND (pp.property_item_id IN ($ids))
GROUP BY property_items.id
HAVING COUNT(pp.id) >= $countIds
当我在$ids
中只有一个元素时,这种方法效果很好,但是当我再选择一个元素时,结果很糟糕。看来sql会返回$ids
中具有任何属性的所有产品的计数,但是我只需要计数包含所有属性的产品。
首先获取所有可用属性。在每个属性上,加入包含此属性的产品,然后返回到该产品的所有属性以进行检查(如果产品也包含已检查的属性)。还是一个坏主意?我需要将主表(FROM表)保持为property_items
。
我需要以这种格式获取结果:
=============================
id|description|products_count
=============================
1 |lorem ipsum|10
-----------------------------
2 |dolore sit |2
感谢任何想法。
答案 0 :(得分:0)
尝试将SELECT COUNT(DISTINCT products.id)用作cnt
答案 1 :(得分:0)
您可以通过执行以下操作获得具有所有属性的产品ID:
SELECT pp.property_id
FROM property_items pi INNER JOIN
product_properties pp
ON pi.id = pp.property_item_id INNER JOIN
products p
ON pp.product_id = p.id
WHERE pp.property_item_id IN ($ids)
GROUP BY pp.property_id
HAVING COUNT(DISTINCT pp.property_item_id) = $countIds -- has all of them
请注意,我合理化了联接。我认为您对查询的简化不太正确。我还添加了表别名,因此查询更易于编写和阅读。
如果要计算此类产品的数量,请使用子查询:
SELECT COUNT(*)
FROM (SELECT pp.property_id
FROM property_items pi INNER JOIN
product_properties pp
ON pi.id = pp.property_item_id INNER JOIN
products p
ON pp.product_id = p.id
WHERE find_in_set(pp.property_item_id, $ids)
GROUP BY pp.property_id
HAVING COUNT(DISTINCT pp.property_item_id) = $countIds -- has all of them
) ;
您的问题可能是因为此行:
WHERE pp.property_item_id IN ($ids)
如果您将$ids
作为逗号分隔的字符串进行传递,则您的查询将不起作用。请注意上面的替换。