数据库根据多个值选择多行

Database Selecting Multiple Rows Based on Multiple Values

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

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

我只想 select DRINKSIDs 来自 DRINKS_INGREDIENTS table 的成分等于我们在 stock.ex 中的那些 - 如果我们只有 Gin and Tonic 库存,那么它应该 return 只有 DrinkID=3.If 我们有库存的所有成分,那么它将return 列表中的所有 DrinkID。

我们还可以假设 库存是无限的,因此不需要数量检查。

我正在使用 sqlite 数据库,但我不确定如何编写查询来完成这项工作。

要查找给定的库存原料可以制作哪些饮料,您可以在两个查询之间进行内部连接。第一个将为您提供制作每种饮料所需的原料数量,另一个将为您提供每种饮料的库存原料数量。通过在 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

修改它以考虑库存数量也很容易,只需将数量添加到库存 table,然后修改第二个查询中的连接以包含 s.quantity >= di.quantity。看到这个 sample.