2011-05-05 79 views
1

我觉得我在考虑这两个问题,解决方案应该更简单,也许它只是那些日子中的一个。一个查询从表A中选择一个在关系表B中有两个选项的记录

但我有3个表

产品

 
productId name  
----------------- 
1   the 
2   name 
3   does't 
4   matter 

选项

 
optionId name  
----------------- 
1   the 
2   name 
3   does't 
4   matter 

product_option

 
id productId optionId 
------------------------- 
1 1   1 
1 1   3 
1 2   4 
1 2   1 
1 3   1 

我想检查productId 1是否有optionId 1和optionId 3(在本例中为true),这是否可以在单个查询中执行?

回答

2
SELECT P.productId, P.name 
    FROM product AS P 
WHERE 2 = (SELECT COUNT(*) 
       FROM product_option AS PO 
      INNER 
       JOIN option AS O 
       ON PO.optionId = O.optionId 
       AND PO.productId = P.productId 
       AND O.name IN ('value1', 'value2')); 
+0

好的答案:)我在同一条路上,但是它被过度工程化为一个UDF。 – Bueller 2011-05-05 18:29:36

+0

非常感谢! – Patcouch22 2011-05-05 20:11:11

1

乍一看,你可以试试

Select po1.Id 
from Product_Option po1 
inner join Product_Option po2 
    on po1.productId = po2.productId 
    and po1.optionId != po2.productId 
where po1.optionId = 1 
and po2.optionId = 3 

这也许不是很需要的东西,但它是在那里我将开始。特别是如果这是一个临时(或不经常使用)的查询。

2
SELECT p.productId 
    FROM product p 
     INNER JOIN product_option po 
      ON p.productId = po.productId 
       AND po.optionId IN (1,3) 
    GROUP BY p.productId 
    HAVING COUNT(DISTINCT po.optionId) = 2 
+0

这也帮助我得到了我的最终查询,谢谢! +1 – Patcouch22 2011-05-05 20:11:40

相关问题