2015-01-05 3 views
0

나는 칵테일 이름과 그 재료를 저장할 데이터베이스를 설계하고 있습니다. 데이터베이스의 구조는 다음과 같습니다.데이터베이스 여러 값을 기반으로 여러 행 선택

Drinks  
ID NAME IMGURL 
1 A  http:// 
2 B  http:// 
3 C  http:// 

Ingredients 
ID NAME 
1 Water 
2 SugarSyrup 
3 Rum 
4 Vodka 
5 Gin 
6 Tonic 
7 Orange Juice 
8 Whiskey 

DRINKS_INGREDIENTS   
ID DRINKSID INGREDIENTSID Quantity 
1 1 1 30 
2 1 4 90 
3 1 6 60 
4 2 8 30 
5 2 1 30 
6 2 2 30 
7 2 3 10 
8 2 4 30 
9 3 5 60 
10 3 6 60 

Stocks 
StockID IngredientID 
1 5 
2 6 

내가 DRINKSIDs에서 DRINKS_INGREDIENTS 성분 우리는 재고 진토닉이있는 경우 우리가 stock.ex-에있는 사람에게 동일 테이블 만 선택하려면, 다음 만 반환해야 DrinkID = 3. 모든 재료를 재고가 있으면 목록의 모든 DrinkID가 반환됩니다.

주식은 무한합니다 (). 수량 확인이 필요하지 않습니다.

sqlite 데이터베이스를 사용하고 있는데이 작업을 수행하는 쿼리를 작성하는 방법을 모르겠습니다.

+0

음료수를 모두 마실 수 있는지 어떻게 결정 하시겠습니까? –

+0

누군가는 매일 그 값을 수동으로 업데이트하기 때문에 미리 알고 있습니다. 값은 문자열 배열에 저장됩니다. – SteveIrwin

+0

하지만 나는 그 음료에 대해 물어보고 싶습니다. 어떤 재료를 먹어야하는지 확인하고 싶습니다. 검사 할 성분들 B를 묻는 것이 좋습니다. –

답변

1

주어진 재료를 재고로 만들 수있는 음료를 찾으려면 두 개의 쿼리 사이에서 내부 결합을 수행 할 수 있습니다. 첫 번째는 각 음료를 만들기 위해 필요한 재료의 수를 줄 것이고 다른 하나는 각 음료의 재료 재고를 계산할 것입니다. drinks.ID에 대한 쿼리에 합류하면 재고가 필요한 모든 재료가 들어있는 음료를 얻을 수 있습니다.

이 쿼리는 당신이 원하는 것을 수행해야합니다

select drinks.name from (
    select d.NAME, di.DRINKSID, count(*) as cnt 
    from DRINKS_INGREDIENTS di 
    inner join Drinks d on d.ID = di.DRINKSID 
    group by d.name, di.DRINKSID 
) drinks 
inner join (
    select di.DRINKSID, count(*) as cnt 
    from DRINKS_INGREDIENTS di 
    inner join stock s on di.INGREDIENTSID = s.IngredientID 
    group by di.DRINKSID 
) stock 
on drinks.DRINKSID = stock.DRINKSID 
    and drinks.cnt = stock.cnt; 

Sample SQL Fiddle

너무 계정의 재고 수량을 바로 주식 테이블에 수량을 추가하고 수정을 쉽게 수정할 것 s.quantity> = di.quantity를 포함하는 두 번째 쿼리의 조인. 이 부분은 sample입니다.

+1

고마워요. 해결책은 훌륭해 보입니다. 수량 검사는 추가 이점입니다. – SteveIrwin