2010-01-22 6 views
0

SQL 질문이 있습니다. 나는 테이블의 다음 세트로 일하고 있어요 : 레시피 테이블은 5 개 조리법을 포함SQL 연관 개체 질문

http://imgur.com/eg19r.png

, 성분은 (52) 많은 성분을 포함하고 IngredientList는 연관 기업, 여러 대의 구현입니다 조리법과 성분 사이 많은 관계. RecipeID 및 IngredientID는 기본적으로 자동 증가 ID 번호입니다.

나는 (관련 Ingredient.Name의에서

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

없이 즉, 요리법) 모든 채식 요리법을 표시하는 쿼리를 작성하려고 해요. 내가 겪고있는 문제는 결과 세트가 레서피 당 하나의 행이 아닌 성분 당 하나의 행을 포함한다는 것입니다.

이다이 결과 집합 (성분 표가 여기에 재료라는 점에 유의)를 생성 쿼리 : 그 쿼리 (안 52 (50 개) 결과를 생성

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

,이 개 성분들이 성분에 따라 제외하기 때문이다. WHERE 절에서 제외 된 부분 문자열을 포함하는 이름).

제 목표는 레시피 테이블에서 5 개의 레시피 이름 중 3 개를 반환합니다 (관련된 ingredients.name에서 고기가 들어있는 레시피를 뺍니다).

+0

"숙제"로 표시해야합니다. – Timothy

답변

1

성분 표에 is_vegetarian 플래그를 추가 할 수 있습니다.

하지만 주된 문제는 select 절에 ingredients.name을 포함하여 50 행을 반환하도록 데이터베이스에 요청하는 것입니다. 조리법 만 원할 경우

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