MySQL(主义)-计算内部连接的计数> X

时间:2019-01-15 10:50:57

标签: mysql sql join doctrine

我有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

感谢任何想法。

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作为逗号分隔的字符串进行传递,则您的查询将不起作用。请注意上面的替换。