0

我有一个 SQL 问题。我正在使用以下一组表:

http://imgur.com/eg19r.png

Recipe 表包含 5 个配方,成分包含许多成分 (52),成分列表是一个关联实体,是配方和成分之间多对多关系的实现。RecipeID 和 IngredientID 本质上是自动递增的 ID 号。

我正在尝试编写一个显示所有素食食谱的查询(即没有

'%beef%',
'%pork%',
'%chicken%',
'%lamb%

在任何相关的成分。名称中)。我遇到的问题是结果集每个成分包含一行,而不是每个食谱一行。

生成这个结果集的查询是(注意这里的成分表被命名为成分):

SELECT recipe.name AS Dish, ingredients.name
 FROM (recipe JOIN ingredientlist ON recipe.recipeid=ingredientlist.recipeid
  JOIN ingredients ON ingredientlist.ingredientid=ingredients.ingredientid)
 WHERE ingredients.name NOT LIKE '%beef%'
  AND ingredients.name NOT LIKE '%chicken%' 
  AND ingredients.name NOT LIKE '%pork%' 
  AND ingredients.name NOT LIKE '%lamb%';

该查询生成 50 个结果(不是 52 个,因为根据它们的成分名称排除了两种成分,其中包含我的 WHERE 子句排除的子字符串)。

我的目标是返回配方表中 5 个配方名称中的 3 个(减去相关成分中包含肉类的名称)。

4

2 回答 2

1

您可能想在成分表中添加一个 is_vegetarian 标志。

但是您的主要问题是您要求数据库通过在您的选择子句中包含成分名称来返回 50 行。如果你只想要食谱,你只需要询问食谱:

select r.name as dish
from recipe r
where not exists (
  select 1 from ingredients i
  join ingredientlist il on i.ingredientsid=il.ingredientid
  where il.recipeid=r.recipeid
  and i.is_vegetarian = false
)
于 2010-01-22T14:53:51.157 回答
0

我结束了这个查询:

SELECT r.name AS Dish
    FROM recipe r
    WHERE recipeid NOT IN (
        SELECT il.recipeID
            FROM ingredientlist il, ingredients i
            WHERE (il.ingredientid = i.ingredientid)
            AND (i.name LIKE '%beef%' OR i.name LIKE '%chicken%' OR i.name LIKE '%pork%' OR i.name LIKE '%lamb%'));
于 2010-01-25T13:37:36.393 回答