选择pivot具有ALL ID的行

时间:2015-10-13 15:35:42

标签: mysql select

案例: 我想要所有拥有company_id 8和13的公司,但只要他们拥有所有product_ids(1,2,4,8)。

问题: company_id 13没有product_ids 4和8,但仍显示在查询结果中,如下所示。似乎cp.product_id IN(1,2,4,8)返回公司,如果它有其中一个值,但我需要它们在数据透视表company_products中包含所有这些值。

SELECT
    c.id as company_id,
    cp.product_id
FROM
    `companies` as c
    LEFT JOIN `company_products` cp ON cp.company_id = c.id
WHERE
    c.id IN (8, 13)
    AND cp.product_id IN (1,2,4,8)
GROUP BY
    c.id

我的猜测是我应该使用除IN以外的其他东西,但我的研究并没有引导我找到正确的解决方案。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以在查询中添加having子句,以确保每组c.id都包含所有四个cp.product_id:

SELECT
    c.id as company_id
FROM
    `companies` as c
    LEFT JOIN `company_products` cp ON cp.company_id = c.id
WHERE
    c.id IN (8, 13)
    AND cp.product_id IN (1,2,4,8)
GROUP BY
    c.id
HAVING COUNT(DISTINCT cp.product_id) = 4;    

Sample SQL Fiddle

如果您还需要产品详细信息,可以将上述查询用作派生表,并将其与产品表连接。