从查询中排除与子查询结果中的值IN相关的所有行

时间:2014-06-05 10:48:20

标签: mysql sql

我有一个包含这些表的数据库(省略与问题无关的列,所有列都是主键):

recipes (name, ...)
ingredients (name, ...)
composition (rec_name,ing_name)

组合物通过其(唯一)名称来描述配方和成分。

我想选择所有食谱,这些食谱的成分都存在于生成白名单的给定子查询中(或排除包含非白名单成分的所有食谱)。

到目前为止,我提出了这个问题:

SELECT  DISTINCT recipes.name 
FROM recipes,ingredients, composition 
WHERE recipes.name = composition.rec_name AND 
    ingredients.name = composition.ing_name

GROUP BY ingredients.name

HAVING ingredients.name = ANY (**SUBQUERY**)

通过这种方式,我可以排除非白名单成分,但是由于其他白名单成分而退回食谱(如果我删除DISTINCT每个食谱显示的次数是多少"好&#34 ;它的成分)。如果配方含有非白名单成分,我怎么能完全取出配方呢?

我没有在问题中包含子查询,因为它相当长并且已经过测试且有效,它从SELECT ingredients.name FROM ...开始,因此没有类型问题。< / p>

1 个答案:

答案 0 :(得分:0)

如果要检查配方是否包含子查询中的所有成分,那么您只需计算列表中的成分的次数。这是一种方式:

SELECT c.rec_name
FROM composition c
GROUP BY c.rec_name
HAVING sum(ing_name not in (**SUBQUERY**)) = 0;