我喜欢在除夕夜做鸡尾酒,有很多食谱。今年,我想把它变小,尽量减少打开果汁的数量等,所以我花时间把我喜欢的所有菜谱都转储到一个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 by
和having
:
select ri.rid
from recipe_ingredient ri
group by ri.rid
having sum( ri.iid not in (@i1, @i2, @i3 )) = 0;