mysql - 选择数据透视表具有所有 ID 的行

标签 mysql select

案例: 我想要所有 company_id 为 8 和 13 的公司,但前提是它们拥有所有 Product_id (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 以外的东西,但我的研究并没有引导我找到正确的解决方案。感谢您的帮助。

最佳答案

您可以在查询中添加一个 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

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

关于mysql - 选择数据透视表具有所有 ID 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106843/

相关文章:

mysql - 为什么要使用 TLS 的客户端和服务器证书?

mysql - 使用 JDBC Mysql 连接时出错

php - 如何在 Codeigniter 中对始终位于顶部的特定/某些行的表进行排序?

php - 从 mysql 加载字符串作为 xml

MySQL SELECT 超过两个表

mysql - hibernate是否默认在建表时添加索引(mysql)

javascript - 通过从下拉列表中选择,启用另一个下拉列表

ruby - 为什么这个 .each block 返回的结果与 .select 不同?

javascript - 选择在提交表单模式后获得双选项

mysql - SonarQube 仪表板显示 - 等待分析超过两天