MySQL 过滤食谱的多对多 - 配料表

MySQL Filter on many-to-many on recipes - ingredients tables

在我的应用程序中,我有 3 个 tables:

  1. 食谱
-id
-name
-description
  1. 成分
-id
-name
  1. recipes_ingredients
-recipes_id
-ingredients_id

我需要找到所有那些包含 ingredients_id 列表的食谱,并且我在我的食物存储中有这些食谱,并且在我提供的列表之外包含 NO OTHERS id (所以不在我的食物储藏室里)。

示例:我提供油(id=111)面包=(id=222)结果食谱:

此查询不起作用,因为它返回的食谱完全准确地提供了所提供的成分:

SELECT ri.recipes_id
FROM recipes_ingredients ri
WHERE ri.ingredients_id IN (111,222)
GROUP BY ri.recipes_id
HAVING COUNT(*) = 2;

我也尝试过更改

中的 HAVING COUNT
HAVING COUNT(*) <= length_of_list_I_provided

但他把所有的食谱都还给了我,是的,甚至只有一部分提供的配料,还有我没有在列表中提供的配料。

你有什么想法吗?

感谢和问候

更新:

正如他们向我建议的那样,我给你看一个 tables:

的例子

食谱table:

ID NAME
1 Recipe 1
2 Recipe 2
3 Recipe 3
4 Recipe 4
5 Recipe 5
6 Recipe 6

成分table:

ID NAME
111 Oil
222 Bread
333 Salt
444 Pepper

Recipes_Ingredients table:

RECIPES_ID INGREDIENTS_ID
1 111
1 222
2 222
3 222
3 333
4 111
4 222
4 333
5 333
5 444
6 111

在查询中我给出了我的成分

IN(111,222)

必须return:

RECIPE_ID
1
2
6

也许你可以使用这个查询

SELECT ri.recipes_id
FROM recipes_ingredients ri
GROUP BY ri.recipes_id
HAVING COUNT(CASE WHEN ri.ingredients_id NOT IN (111,222) THEN 1 ELSE NULL END) =0;

demo fiddle link