我正在设计一个存储鸡尾酒名称及其成分的数据库。 数据库具有以下结构。
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数据库,我不知道如何编写查询来使其工作。
答案 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;
很容易修改它以便在库存中获取库存数量,只需将数量添加到库存表中,并在第二个查询中修改连接以包括s.quantity> = di.quantity。请参阅此sample。