许多人加入其他地方

时间:2014-11-25 07:38:31

标签: mysql sql many-to-many

我认为我有一个微不足道的问题,但我无法弄清楚这是如何运作的。我有以下公司和产品表与简单的多对多关系。

我如何扩展此查询,以便结果只包含让所有公司拥有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 

2 个答案:

答案 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

转到Sql Fiddle

如果您想知道主查询中有关相关产品的信息,那么除了现有查询之外,您还必须使用连接。

答案 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)

如果您需要更多帮助,请说明。