SQL :如何检查 table 的所有条目是否在另一个 table 中
SQL : how to check if all entries of a table are in another table
我正在尝试制作一个程序,用户可以在其中输入他们家中的食材,系统会给出他们可以只使用这些食材制作的食谱。
Table 种制作食谱所需的原料。
'recipe_ingredients'
+----------------+---------------+-----------------+
| curr_recipe_id | ingredient_id | ingredient_name |
+----------------+---------------+-----------------+
| 1 | 1 | ingredient 1 |
| 1 | 2 | ingredient 2 |
| 1 | 3 | ingredient 3 |
| 1 | 4 | ingredient 4 |
| 2 | 5 | ingredient 5 |
| 2 | 6 | ingredient 6 |
| 2 | 7 | ingredient 7 |
| 2 | 8 | ingredient 4 |
| 2 | 9 | ingredient 2 |
| 2 | 10 | ingredient 8 |
| 2 | 11 | ingredient 9 |
| 2 | 12 | ingredient 10 |
+----------------+---------------+-----------------+
Table 个食谱
+-----------+----------------------+
| recipe_id | name |
+-----------+----------------------+
| 1 | recipe 1 |
| 2 | recipe 2 |
+-----------+----------------------+
Table家里的食材:
'home_ing'
+---------------+
| home_ing_name |
+---------------+
| ingredient 1 |
| ingredient 2 |
| ingredient 3 |
| ingredient 4 |
+---------------+
我想得到所有我能用家里的原料做的食谱。
我应该得到什么作为输出:
Table 种可能的家庭配料食谱:
+----------------+
| recipe id |
+----------------+
| 1 |
+----------------+
我试过使用这个查询:
select *
from recipes
where recipe_id in (select curr_recipe_id
from recipe_ingredients
where ingredient_name) in (select home_ing_name from home_ing));
这个查询returns:
+----------------+
| recipe id |
+----------------+
| 1 |
| 2 |
+----------------+
因为我家的食材table含有食谱2的其中一种食材
您可以:
Select recepi_id, MIN(HaveIngredient) from(
Select IR.recepi_id, Case when IH.home_ing_name is null then 0 else 1 end as HaveIngredient
from tableOfInredients IR
Left join tableOfIngredientsAtHome IH
on IR.Ingredient_Name = IH.Home_ing_name) tmp
group by recepi_id
having MIN(HaveIngredient) = 1
这里的第一步是将我拥有的配料加入收据清单。如果我有成分,如果不是 0,我将标记为 1。
然后我只希望每个 recepi 有一行,并且我 select recepi_Id 的 MIN 值为 HaveIngredient 值。在有条款 I select 只是所有成分都在家的地方。
此查询获取输入中提供的成分 不满足 的所有 recipe_ingredient 记录,并从中获取所有不符合的食谱在该列表中。
SELECT r.recipe_id
FROM recipe r
WHERE NOT EXISTS(
SELECT * FROM recipe_ingredient ri
WHERE ri.recipe_id = r.recipe_id
AND NOT EXISTS(
/* making the assumption here that the list of ingredients you have is provided
in some form of input that can be placed in temp table or similar */
SELECT * FROM #my_ingredients mi
WHERE mi.ingredient_id = ri.ingredient_id
)
)
这里与其他方法的主要区别在于,它将 return 没有 任何 成分的食谱,这取决于您的要求可能会或可能不理想。
SELECT
recipe_id,
name
FROM recipe
WHERE recipe_id NOT IN (
SELECT recipe_id
FROM recipe_ingredients ri
LEFT JOIN home_ing h ON h.home_ing_name = ri.ingredient_name
WHERE home_ing_name IS NULL)
这个 SQL 列出了没有(NOT IN
)不匹配成分的所有食谱。 sub-query 将找到 non-existing home_ingredients 所需的食谱。
参见:DBFIDDLE
我正在尝试制作一个程序,用户可以在其中输入他们家中的食材,系统会给出他们可以只使用这些食材制作的食谱。
Table 种制作食谱所需的原料。 'recipe_ingredients'
+----------------+---------------+-----------------+
| curr_recipe_id | ingredient_id | ingredient_name |
+----------------+---------------+-----------------+
| 1 | 1 | ingredient 1 |
| 1 | 2 | ingredient 2 |
| 1 | 3 | ingredient 3 |
| 1 | 4 | ingredient 4 |
| 2 | 5 | ingredient 5 |
| 2 | 6 | ingredient 6 |
| 2 | 7 | ingredient 7 |
| 2 | 8 | ingredient 4 |
| 2 | 9 | ingredient 2 |
| 2 | 10 | ingredient 8 |
| 2 | 11 | ingredient 9 |
| 2 | 12 | ingredient 10 |
+----------------+---------------+-----------------+
Table 个食谱
+-----------+----------------------+
| recipe_id | name |
+-----------+----------------------+
| 1 | recipe 1 |
| 2 | recipe 2 |
+-----------+----------------------+
Table家里的食材: 'home_ing'
+---------------+
| home_ing_name |
+---------------+
| ingredient 1 |
| ingredient 2 |
| ingredient 3 |
| ingredient 4 |
+---------------+
我想得到所有我能用家里的原料做的食谱。
我应该得到什么作为输出:
Table 种可能的家庭配料食谱:
+----------------+
| recipe id |
+----------------+
| 1 |
+----------------+
我试过使用这个查询:
select *
from recipes
where recipe_id in (select curr_recipe_id
from recipe_ingredients
where ingredient_name) in (select home_ing_name from home_ing));
这个查询returns:
+----------------+
| recipe id |
+----------------+
| 1 |
| 2 |
+----------------+
因为我家的食材table含有食谱2的其中一种食材
您可以:
Select recepi_id, MIN(HaveIngredient) from(
Select IR.recepi_id, Case when IH.home_ing_name is null then 0 else 1 end as HaveIngredient
from tableOfInredients IR
Left join tableOfIngredientsAtHome IH
on IR.Ingredient_Name = IH.Home_ing_name) tmp
group by recepi_id
having MIN(HaveIngredient) = 1
这里的第一步是将我拥有的配料加入收据清单。如果我有成分,如果不是 0,我将标记为 1。
然后我只希望每个 recepi 有一行,并且我 select recepi_Id 的 MIN 值为 HaveIngredient 值。在有条款 I select 只是所有成分都在家的地方。
此查询获取输入中提供的成分 不满足 的所有 recipe_ingredient 记录,并从中获取所有不符合的食谱在该列表中。
SELECT r.recipe_id
FROM recipe r
WHERE NOT EXISTS(
SELECT * FROM recipe_ingredient ri
WHERE ri.recipe_id = r.recipe_id
AND NOT EXISTS(
/* making the assumption here that the list of ingredients you have is provided
in some form of input that can be placed in temp table or similar */
SELECT * FROM #my_ingredients mi
WHERE mi.ingredient_id = ri.ingredient_id
)
)
这里与其他方法的主要区别在于,它将 return 没有 任何 成分的食谱,这取决于您的要求可能会或可能不理想。
SELECT
recipe_id,
name
FROM recipe
WHERE recipe_id NOT IN (
SELECT recipe_id
FROM recipe_ingredients ri
LEFT JOIN home_ing h ON h.home_ing_name = ri.ingredient_name
WHERE home_ing_name IS NULL)
这个 SQL 列出了没有(NOT IN
)不匹配成分的所有食谱。 sub-query 将找到 non-existing home_ingredients 所需的食谱。
参见:DBFIDDLE