我喜欢在除夕夜做鸡尾酒,有很多食谱。今年,我想把它变小,尽量减少打开果汁的数量等,所以我花时间把我喜欢的所有菜谱都转储到一个MySQL数据库中,基本上有以下格式:

RECIPE
    RID (INT, PK, auto_inc)
    NAME (VARCHAR)

INGREDIENT
    IID (INT, PK, auto_inc)
    NAME (VARCHAR)

RECIPE_INGREDIENT
    RID (INT, FK to RECIPE.RID)
    IID (INT, FK to INGREDIENT.IID)
    AMOUNT (VARCHAR)
    PK: RID, IID

我现在想说的是“我不能没有鸡尾酒x,y和z”。确定制造x,y和z所需的成分很简单。
但是,如果我有i1、i2和i3的成分,我能做什么食谱呢
我很快想到的是一个过程,它遍历所有的配方,并将它们添加到最后返回的集合中,前提是没有rid iid映射,而其iid不在给定的iid集合中。但我不是一个数据库或sql专家,现在已经很累了,所以我想可能会有更多的天才。。。

最佳答案

您可以使用group byhaving

select ri.rid
from recipe_ingredient ri
group by ri.rid
having sum( ri.iid not in (@i1, @i2, @i3 )) = 0;

10-07 17:56