首页 > 解决方案 > 确定我可以用我的原料烹饪的食谱的优雅方式

问题描述

我喜欢在除夕做鸡尾酒,而且有不少食谱。今年,我想让它更小,尽量减少打开果汁的数量等,所以我花时间将我喜欢的所有食谱转储到 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 所需的成分是微不足道的。

但是,回答“如果我有 i 1、 i 2和 i 3的成分,我可以制作什么食谱?”这个问题的优雅方式是什么?

我很快想到的是一个迭代所有食谱并将它们添加到最后返回的集合的过程,只有当它没有 iid 不在给定 iid 集合中的 rid_iid 映射时才返回。但我不是数据库或sql大师,现在很累,所以我认为可能有更聪明的东西......

标签: mysqlsql

解决方案


您可以使用group byhaving

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

推荐阅读