我的数据库中有以下3个表,在查询它们以获得所需的结果时遇到一些问题。我正试着按配料寻找食谱。
SQL小提琴:Fiddle
这是我的桌子:
成分

+---------------+---------+
| ingredient_id | name    |
+---------------+---------+
|             1 | tomato  |
|             2 | onion   |
|             3 | rice    |
|             4 | chicken |
|             5 | beef    |
|             6 | noodles |
|             7 | salt    |
+---------------+---------+

食谱
+-----------+------------------+
| recipe_id | name             |
+-----------+------------------+
|         1 | tomato goodness  |
|         2 | meat deluxe      |
|         3 | chicken surprise |
+-----------+------------------+

成分指数
+-----------+---------------+
| recipe_id | ingredient_id |
+-----------+---------------+
|         1 |             1 |
|         1 |             5 |
|         1 |             7 |
|         2 |             5 |
|         2 |             6 |
|         2 |             7 |
|         3 |             4 |
|         3 |             3 |
|         3 |             7 |
+-----------+---------------+

我想达到的目的,是过滤所有我能用特定成分制作的食谱。问题来了:
此查询:
select DISTINCT r.name
from
    recipes r
    inner join ingredient_index i
    on i.recipe_id = r.recipe_id
where i.ingredient_id IN (2, 7, 5);

给我错误的结果,因为我没有足够的原料来做任何食谱,但我仍然得到一个结果,我可以做所有的。这是因为配方ID在成分索引表中重复。
如有任何帮助,我将不胜感激。

最佳答案

正如jarlh所说,检查没有遗漏的成分:

select DISTINCT r.name
from recipes r
where not exists (
select 1 from ingredient_index i where r.recipe_id=i.recipe_id and i.ingredient_id not in (2,5,7)
)

关于mysql - 配方数据库,按成分搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47453267/

10-10 15:20