2010-01-22 3 views
0

У меня вопрос SQL. Я работаю со следующим набором таблиц:SQL ассоциативный вопрос вопрос

http://imgur.com/eg19r.png

В таблице Рецепт содержит 5 рецептов, ингредиент содержит множество ингредиентов (52), и IngredientList ассоциативная организация, реализация многих-to многие отношения между Рецептом и Ингредиентом. RecipeID и IngredientID являются, по сути, идентификационными номерами с автоматическим увеличением.

Я пытаюсь написать запрос, который отображает все вегетарианские рецепты (то есть рецепты без

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

Моя цель - вернуть 3 из 5 названий рецептов в таблице рецептов (вычитая те, которые содержат мясо в связанных ингредиентах. Имя).

+0

Должно быть помечено как «Домашнее задание», – Timothy

ответ

1

Возможно, вы захотите добавить флаг is_vegetarian в таблицу ингредиентов.

Но основная проблема заключается в том, что вы запрашиваете базу данных, чтобы вернуть 50 строк, включив в ваше предложение select items.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%'));