数据库根据多个值选择多行
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;
修改它以考虑库存数量也很容易,只需将数量添加到库存 table,然后修改第二个查询中的连接以包含 s.quantity >= di.quantity。看到这个 sample.
我正在设计一个数据库来存储鸡尾酒名称及其成分。 数据库具有以下结构。
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;
修改它以考虑库存数量也很容易,只需将数量添加到库存 table,然后修改第二个查询中的连接以包含 s.quantity >= di.quantity。看到这个 sample.