数据库基于多个值选择多行

时间:2015-01-05 11:23:41

标签: sql database sqlite

我正在设计一个存储鸡尾酒名称及其成分的数据库。 数据库具有以下结构。

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

我想从 DRINKS_INGREDIENTS 表中仅选择 DRINKSID ,其中的成分等于我们库存中的成分。如果我们只有库存中的Gin和Tonic ,那么它应该只返回DrinkID = 3.如果我们有库存中的所有成分,那么它将返回列表中的所有DrinkID。

我们还可以假设股票是无限的,因此不需要进行数量检查。

我正在使用sqlite数据库,我不知道如何编写查询来使其工作。

1 个答案:

答案 0 :(得分: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