在尝试创建一个实际上非常简单的 SQL 语句时,我发现自己迷失了方向。
我有一个包含 3 个表的数据库:
- 食谱 - 存储一些用于烹饪的食谱名称
- 配料食谱 - 将配料与食谱联系起来
- 成分 - 食谱使用的成分。
它像这样存储以使其双重清晰:
食谱:
编号 | 姓名 1 | 烤宽面条 2 | 金枪鱼配西红柿
配料:
编号 | 姓名 1 | 千层面 2 | 肉 3 | 番茄 4 | 金枪鱼
并加入表成分_食谱:
成分ID | recipes_id 1 | 1 2 | 1 3 | 1 3 | 2 4 | 2
正如你所看到的,有 2 种非常美味的食谱,我至少应该给它们一些香料。但我之前想做的是按成分选择食谱。
我想让我所有的食谱都有肉和西红柿:
SELECT recipes.name FROM recipes r
INNER JOIN ingredients_recipes ir ON ir.recipes_id = r.id
WHERE ir.ingredient_id IN ( 2 ) AND ir.ingredient_id IN ( 3 )
-> 烤宽面条.. 好!(我使用 IN 因为可能有一堆成分,比如“西红柿”、“西红柿”、“西红柿、切片”等。)
例如,当我想要所有的食谱都有西红柿但没有金枪鱼时,我尝试了:
SELECT recipes.name FROM recipes r
INNER JOIN ingredients_recipes ir ON ir.recipes_id = r.id
WHERE ir.ingredient_id IN ( 2 ) AND ir.ingredient_id NOT IN ( 4 )
-> 仍然得到金枪鱼 - 因为我加入的行之一不包含成分 4。好的:/
我现在想知道的是,我必须做什么才能得到我想要的结果。我目前通过这样的子选择在我的膝盖上放了一个箭头:
SELECT recipes.name FROM recipes r
INNER JOIN ingredients_recipes ir ON ir.recipes_id = r.id
WHERE (
ir.ingredient_id IN ( 2 ) -- or more..
AND
recipes.id NOT IN ( SELECT recipes_id FROM ingredients_recipes
WHERE ingredient_id IN ( 4 ) -- actually i paste names of the ingredients.. but that is not the case. just to shorten the query.. by filling in a comment twice as long..
)
)
因为我对 mySQL 很陌生,所以我什至不知道要谷歌搜索什么。所以在这种情况下的任何帮助,并且o/c更好的SQL语句将是..
IN(awesome).
编辑:啊,是的,我实际上是在分组.. ;-)