2010-01-22 132 views
0

我有一个SQL问题。我用下面的一组表的工作:SQL关联实体问题

http://imgur.com/eg19r.png

的配方表中包含5个配方,成分中含有很多成分(52),以及IngredientList是一个关联实体,许多-TO-的实现食谱和配料之间有很多关系。 RecipeID和IngredientID本质上是自动递增的ID号码。

我想写显示所有素食食谱的查询(即,食谱没有

'%beef%', 
'%pork%', 
'%chicken%', 
'%lamb% 
他们的任何相关Ingredient.Name的

)。我遇到的问题是,结果集包含每个配料一行,而不是每个配方一行。

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

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个(减去那些包含关联的ingredients.name中的肉)。

+0

应该被标记为“家庭作业” – Timothy 2010-01-25 13:44:38

回答

1

您可能需要在您的配料表中添加is_vegetarian标志。

但是,你的主要问题是,你要求数据库返回50行,在你的select子句中包含ingredients.name。如果你只想要食谱,你只需要问食谱:

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 
) 
0

wallenborn,谢谢你的帮助。

我根本没有修改表格的能力(这是一个关于学校作业的问题)。我收到了发给我的教师的电子邮件,他暗示了使用子查询。我结束了这个查询:

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%'));