2014-06-20 3 views
0

일부 재료 목록과 일치하는 모든 요리를 선택하기 위해 두통 검색/검색 쿼리가 시작됩니다.SQL 재료 기준과 일치하는 모든 요리 선택

내 테이블 :

Ingredients 
============ 
ID 
IngredientName 
IngredientAmount 
P_ID 


Dishes 
========== 
ID 
DishName 


DishIngredients 
========== 
ID 
DishID 
IngredeientID 
IngredientAmount 

즉, 두 성분의 이름을 갖는, 나는 모든 요리를 제공의 일부와 나는 그것에서 할 수 있습니다 (이있을 것이다 많은 요리 (그래서 그들의 P_ID's을 알고 싶어) 선택합니다 즉, 5 성분)이 순간까지

우리는 다음과 같습니다.이 '토마토'를 필요로 요리를 보여 주지만, 필요하지만 오

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.ID 
WHERE i.IngredientName IN ('salt','tomato') 

ther 성분, 우리가 목록에 가지고있는 dont. 내가 할 것이 무엇

+0

요리 테이블의 구조를 공유 할 수 있습니까? – Mureinik

+0

안녕하세요, "요리"테이블의 구조를 보여 주실 수 있습니다. – Haris

+0

물론 여기 있습니다. – NightSnail

답변

0

는 열 DishIngredientId, DishId, IngredientId와 다른 테이블 DishIngredients을 작성하고이 테이블에 IngredientAmount 이동합니다.
예를 들어, 여러 접시에 토마토를 넣을 수 있지만 양은 다릅니다.

SELECT d.Name, i.IngredientName, di.IngredientAmount 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishId = di.DishId 
INNER JOIN Ingredients AS i ON di.IngredientId = i.IngredientId 
WHERE i.IngredientName = 'Tomato' 

(그리고 당신은 하나 개 이상의 성분을 검색 할 경우는 IN 절을 사용하여 단지 같은 :

는이 같은 성분의 무언가로하는 요리가 토마토의를 찾으려면 다음 세 개의 테이블을 조인 당신은 이미 한)

난 당신이 질문을, 어쩌면 이것은 당신이 (모든 성분) 무슨 뜻입니다 다시 읽었습니다!

SELECT DISTINCT d.DishName 
FROM Dishes AS d INNER JOIN DishIngredients AS di ON d.DishID = di.DishID 
WHERE di.IngredientID IN (SELECT i.IngredientID 
FROM Ingredients AS i WHERE i.IngredientName IN ('Tomato', 'Cheese')) 

그것은 모두 소용이 나열 재료로 토마토와 치즈와 함께 수있는 요리. 당신은 모든 재료를 원하는 경우
참고 사항이 SQL Fiddle

,이 시도 : 각 추가 성분에 대한

SELECT d.DishName, A.IngredientName, B.IngredientName 
FROM Dishes AS d 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Cheese' 
    WHERE d.DishID = di.DishID) AS A 
CROSS APPLY (SELECT di.DishIngredientID, i.IngredientName FROM DishIngredients AS di 
    INNER JOIN Ingredients AS i ON di.IngredientID = i.IngredientID AND i.IngredientName = 'Tomato' 
    WHERE d.DishID = di.DishID) AS B 

, 다른 CROSS APPLY을 추가합니다.

+0

그래, 제 생각에는 DB가 당신의 제안으로 다시 작성되었습니다. 비록 MySQL이 당신의 구문을 좋아하지 않더라도 : AS i ON di.IngredientId on i.IngredientId - 두번째'ON'은 예상치 못한 것입니다. – NightSnail

+0

다음과 같이 편집 한 쿼리가 있습니다 :'SELECT d.Name, i.IngredientName, di.IngredientAmount ASIN IN JOIN DishIngredients as d.DishId = di.DishId INNER JOIN 성분 di.IngredientId = i.IngredientId WHERE i.IngredientName IN ('스파게티', '토마토') 그러나 그것은 토마토를 포함하는 요리를 보여주기 때문에 일을하지 못하지만, 같은 요리는 제공되지 않는 다른 재료를 필요로합니다. – NightSnail

+0

죄송합니다. 두 번째'ON'은 오타였습니다. 실제로는'='이어야합니다. 'AND'및 'OR'구문을 통해 재료를 추가하여 놀 수 있습니다. 이를 반영하도록 쿼리를 업데이트하겠습니다. – CoolWilly

관련 문제