2013-03-13 5 views
-1

recipe 데이터베이스로 볼 수있는 데이터베이스가있는 경우, 주어진 성분으로 만들 수있는 모든 ID를 어떻게 선택할 수 있습니까? 예 : 성분 1과 4가있는 경우 그걸로 만들 수있는 유일한 조리법이므로 3을 반환합니다.many many relationship in many

약 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 검색 한 결과로 문제를 해결할 수 있습니다. UNION 문. 나는 이것이 최선의 해결책이 아니라고 생각하며, 지금까지 나는 더 좋은 길을 찾지 못했다. 그래서 나는 이것으로 일상적인 경험을 가진 사람들이 직접적인 대답을 줄 수있을 것이라고 생각한다. 나는 이런 종류의 질의를 다루기위한 적절한 방법이나 질의를 기대하지 않는다. –

답변

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

you 're welcome ^^ – vaugham

0

시도 :

select recipe_id 
from recipes_ingredients 
group by recipe_id 
having count(*)=sum(case when ingredient_id in (1,4) then 1 end) 
관련 문제