配方数据库,按成分搜索

时间:2012-11-17 03:32:05

标签: mysql sql database

我的数据库中有以下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)

任何帮助都会非常感激!

2 个答案:

答案 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