MySQL 过滤食谱的多对多 - 配料表
MySQL Filter on many-to-many on recipes - ingredients tables
在我的应用程序中,我有 3 个 tables:
- 食谱
-id
-name
-description
- 成分
-id
-name
- recipes_ingredients
-recipes_id
-ingredients_id
我需要找到所有那些包含 ingredients_id 列表的食谱,并且我在我的食物存储中有这些食谱,并且在我提供的列表之外包含 NO OTHERS id (所以不在我的食物储藏室里)。
示例:我提供油(id=111)面包=(id=222)结果食谱:
- OK 油+面包
- OK面包
- 好油
- NO 油+盐
- 没有 面包+油+盐
此查询不起作用,因为它返回的食谱完全准确地提供了所提供的成分:
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;
在我的应用程序中,我有 3 个 tables:
- 食谱
-id
-name
-description
- 成分
-id
-name
- recipes_ingredients
-recipes_id
-ingredients_id
我需要找到所有那些包含 ingredients_id 列表的食谱,并且我在我的食物存储中有这些食谱,并且在我提供的列表之外包含 NO OTHERS id (所以不在我的食物储藏室里)。
示例:我提供油(id=111)面包=(id=222)结果食谱:
- OK 油+面包
- OK面包
- 好油
- NO 油+盐
- 没有 面包+油+盐
此查询不起作用,因为它返回的食谱完全准确地提供了所提供的成分:
SELECT ri.recipes_id
FROM recipes_ingredients ri
WHERE ri.ingredients_id IN (111,222)
GROUP BY ri.recipes_id
HAVING COUNT(*) = 2;
我也尝试过更改
中的 HAVING COUNTHAVING 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;