【发布时间】:2018-01-08 06:01:37
【问题描述】:
我有两张表,一张包含不同的食谱,另一张包含 recipes_ingredients(食谱所需的所有成分)。
recipes
-----
id_recipe
name
description
etc...
recipe_ingredients
-----
id_recipe_ingredient
id_recipe
id_ingredient
假设我只选择了一种成分(例如鸡蛋)。
SELECT *
FROM recipes r
INNER JOIN recipes_ingredients ri ON r.id_recipe = ri.id_recipe
WHERE ri.id_ingredient = 1
这将返回所有包含鸡蛋的食谱。这是合乎逻辑的,但我想创建一个查询,返回所有 ONLY 包含鸡蛋(例如煮鸡蛋)的食谱。不是一些包含鸡蛋的食谱。
如果我同时选择鸡蛋和牛奶并创建相同的查询:
SELECT *
FROM recipes r
INNER JOIN recipes_ingredients ON r.id_recipe = ri.id_recipe
WHERE ri.id_ingredient = 1
OR ri.id_ingredient = 2
我会找到煎蛋卷,但我也会找到所有其他包含鸡蛋和牛奶的食谱。
我要选择的是:
只包含鸡蛋的食谱
只包含鸡蛋和牛奶的食谱
我不想选择包含鸡蛋、牛奶、面粉和糖的蛋糕。
感谢您提供任何可能使我朝着正确方向前进的答案!
【问题讨论】:
-
WHERE ri.id_ingredient = 1 AND ri.id_ingredient = 2 永远不会发生.....你会想要 WHERE ri.id_ingredient = 1 OR ri.id_ingredient = 2;然后检查您是否有 2 个不同的行
-
当然。我的错,我现在改为 OR。但它并没有真正回答我的问题。如果我想搜索所有包含鸡蛋和牛奶的食谱,我只想返回只包含鸡蛋和牛奶的食谱,例如煎蛋。
-
您可以在 where 子句之后使用 NOT EXISTS sql 子句来检查任何其他配方成分。另外,您可以检查 APPLY 运算符
-
似乎是精确关系划分的用例。推荐阅读red-gate.com/simple-talk/sql/t-sql-programming/…