我认为我有一个微不足道的问题,但我无法弄清楚这是如何运作的。我有以下公司和产品表与简单的多对多关系。
我如何扩展此查询,以便结果只包含让所有公司拥有ID为1和2的产品?
我尝试在任何我能想象的地方添加wheres和haves,但我能得到的是所有公司都有id为x的产品(没有附加和)
公司表
id | name
-----------------
1 | Company 1
2 | Company 2
3 | Company 3
公司_产品表
id | product_id | company_id
----------------------------
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1
4 | 1 | 2
5 | 1 | 3
6 | 2 | 3
产品表
id | name
-----------------
1 | Product A
2 | Product B
3 | Product C
声明
SELECT companies.name,
companies.id AS company_id,
products.id AS product_id
FROM companies
LEFT JOIN company_products
ON companies.id = company_products.company_id
INNER JOIN products
ON company_products.product_id = products.id
答案 0 :(得分:0)
如果您想要所有拥有相关产品1和2的公司,您可以编写此查询:
SELECT c.name,
c.id AS company_id
FROM companies c
WHERE (SELECT COUNT(*)
FROM company_products cp
WHERE cp.company_id = c.id
AND cp.product_id in ('1', '2')
) = 2
如果您想知道主查询中有关相关产品的信息,那么除了现有查询之外,您还必须使用连接。
答案 1 :(得分:0)
也许您可以在查询中使用以下子查询:
SELECT company_id, count(*) as no_companies
FROM Companies_Products
WHERE product_id IN (1, 2)
HAVING count(*) = 2
(在这种情况下,公司产品必须只连接一次。)它返回产品1和2的所有company_ids。
总是有一些关于子查询和表现的讨论,但我不认为你会注意到。
您可以使用数组使此功能灵活。
pseudo code:
$parameter = array(1, 2);
...
WHERE product_id IN $parameter
HAVING count(*) = count($parameter)
如果您需要更多帮助,请说明。