2013-03-13 4 views
-1

Если у меня есть база данных, с которой можно увидеть базу данных рецептов, как я могу выбрать все идентификаторы рецептов, которые я могу сделать с данными ингредиентами, например, если у меня есть ингредиент 1 и 4 он вернет 3, поскольку это единственный рецепт, который я могу сделать с этим.выберите во многих отношениях

Будет около 50 ингредиентов и еще много рецептов.

Я вижу несколько возможностей, таких как использование UNION/несколько соединений, но я не вижу простого простого решения этой проблемы.

Recipes Recipes/Ingredients Ingredients 
    1   1 1     1 
    2   1 2     2 
    3   2 1     3 
       2 3     4 
       2 4 
       3 1 
       3 4 

редактировать/

То, что я думал, чтобы решить:

select recipe_id from Recipes 
where recipe_id in ( 
    select recipe_id from Recipes_Ingredients where ingredient_Id = 1 
    UNION 
    select recipe_id from Recipes_Ingredients where ingredient_Id = 4 
) 

Это приведет к очень длинным запросам, как моя база данных не совсем о ингредиентах, но о вещах, которые могут иметь 50 или более из этих вещей в них.

+1

[Что вы пробовали] (http://www.whathaveyoutried.com)? – Kermit

+0

проверить эту ссылку http://stackoverflow.com/questions/349559/sql-how-to-search-a-many-to-many-relationship – Mingebag

+0

@Aarolama Bluenk Я искал, и я смогу решить вопрос с помощью СОЮЗ. Я думаю, что это не лучшее решение, и до сих пор я не нашел лучших способов, поэтому я думаю, что люди с ежедневным опытом с этим смогут дать прямой ответ. Я не ожидаю запроса или чего-то еще, просто подходящего способа решения таких запросов. –

ответ

2

Попробуйте это (я пытался угадать ваши имена столбцов):

Таблица рецептов: Recipe_id

Таблица Recipes_Ingredients: Рецепты | Ингредиенты

SELECT Recipe_id FROM Recipes 
    EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients 
    WHERE Ingredients NOT IN (1,4) 
) 

Я объясню это. Если вы хотите знать, «рецепты, которыми вы обладаете, по крайней мере один ингредиент» (здесь: 1,4):

SELECT DISTINCT Recipes FROM Recipes_Ingredients 
WHERE Ingredients IN (1,4) 

Так противное «рецепт которого я не могу сделать», потому что, вы пропустили по крайней мере, один ингредиент:

SELECT DISTINCT Recipes FROM Recipes_Ingredients 
WHERE Ingredients NOT IN (1,4) 

Затем мы берем все рецепты, за исключением тех, которые вы не можете сделать:

SELECT recipe_id FROM Recipes 
    EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients 
    WHERE Ingredients NOT IN (1,4) 
) 
+0

Это выглядит очень многообещающим, выглядит именно то, что я ищу. Я тестирую его сейчас :) –

+0

Это работает, thx :) –

+0

добро пожаловать ^^ – vaugham

0

Try:

select recipe_id 
from recipes_ingredients 
group by recipe_id 
having count(*)=sum(case when ingredient_id in (1,4) then 1 end) 
Смежные вопросы