我的数据库中有以下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 |
+-----------+------------------+
Ingredient_Index
+-----------+---------------+
| recipe_id | ingredient_id |
+-----------+---------------+
| 1 | 1 |
| 1 | 5 |
| 1 | 7 |
| 2 | 5 |
| 2 | 6 |
| 2 | 7 |
| 3 | 4 |
| 3 | 3 |
| 3 | 7 |
+-----------+---------------+
只搜索一种成分的查询工作正常,并输出:
mysql> select r.recipe_id, r.name
-> from recipes r
-> inner join ingredient_index
-> on i.recipe_id = r.recipe_id
-> where
-> i.ingredient_id = 7;
+-----------+------------------+
| recipe_id | name |
+-----------+------------------+
| 1 | tomato goodness |
| 2 | meat deluxe |
| 3 | chicken surprise |
+-----------+------------------+
但是当使用或使用多种成分时,我们会得到这个
mysql> select r.name
-> from recipes r
-> inner join ingredient_index i
-> on i.recipe_id = r.recipe_id
-> where i.ingredient_id = 7 or i.ingredient_id = 5;
+------------------+
| name |
+------------------+
| tomato goodness |
| tomato goodness |
| meat deluxe |
| meat deluxe |
| chicken surprise |
+------------------+
5行(0.00秒)
并使用“和”结果,没有任何内容
mysql> select r.name
-> from recipes r
-> inner join ingredient_index i
-> on i.recipe_id = r.recipe_id
-> where i.ingredient_id = 7 and i.ingredient_id = 5;
Empty set (0.00 sec)
任何帮助都会非常感激!
答案 0 :(得分:7)
由于配方可以使用多种成分,并且您正在寻找使用一种或多种指定成分的配方,因此您应该使用DISTINCT
关键字来防止配方使用多种成分时出现重复结果指定的列表。此外,您可以使用IN
子句过滤多个成分ID。
select DISTINCT r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5);
或者,如果您正在寻找使用列表中指定的所有成分的配方,那么您可以按配方名称对结果进行分组,并检查记录数是否与列表中的成分数相同。 / p>
select r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5)
GROUP BY r.name
HAVING COUNT(*) = 2
这假设不存在具有相同(recipe_id,ingredient_id)元组的重复记录(使用UNIQUE约束更好地确保)。
答案 1 :(得分:0)
以下fiddle
此查询:
select distinct recipe.name
from recipes recipe, ingredient_index i
where i.ingredient_id = 7 or i.ingredient_id = 5;
产生此结果集:
NAME
tomato goodness
meat deluxe
chicken surprise