繁体   English   中英

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

[英]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

我想,只选择DRINKS_INGREDIENTSDRINKSIDs其中成分等于我们在stock.ex-如果我们只有在股票杜松子酒的那些话,就应该只返回DrinkID = 3,如果我们拥有所有的成分库存,则它将返回列表中的所有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;

示例SQL提琴

修改它以考虑库存数量也很容易,只需将数量添加到库存表,然后在第二个查询中修改联接以包括s.quantity> = di.quantity。 请参阅此示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM