Вопрос об ассоциативной сущности SQL - PullRequest
0 голосов
/ 22 января 2010

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

http://imgur.com/eg19r.png

Таблица рецептов содержит 5 рецептов, Ingredient содержит много ингредиентов (52), а IngredientList - это ассоциативная сущность, реализация отношения «многие ко многим» между Recipe и Ingredient. RecipeID и IngredientID - это, по сути, номера с автоматическим приращением.

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

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

в любом из связанных с ними Ingredient.Name). Проблема, с которой я сталкиваюсь, состоит в том, что результирующий набор содержит одну строку на ингредиент, а не одну строку на рецепт.

Запрос, который генерирует этот набор результатов, (обратите внимание, что таблица Ingredient называется здесь ингредиенты):

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, потому что два ингредиента исключаются на основании их имени component.name, содержащего подстроку, исключенную моим предложением WHERE).

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

Ответы [ 2 ]

1 голос
/ 22 января 2010

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

Но ваша основная проблема заключается в том, что вы просите базу данных вернуть 50 строк, включив ингредиенты.name в ваше предложение select. Если вы хотите только рецепты, вам нужно попросить только рецепты:

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 голосов
/ 25 января 2010

Я завел этот запрос:

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%'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...