仅返回包含所有成分 Sql 的食谱

时间:2020-12-27 18:48:59

标签: sql database count subquery having-clause

我有这 3 个表:

饮料

  • drink_id
  • 姓名

成分

  • ingredient_id
  • 姓名

Opskrifter

  • drink_id
  • ingredient_id
  • 数量

DrinksIngredientsopskrifter 中交叉引用。

我想返回来自 opskrifter 的所有食谱,这些食谱的成分来自另一个名为

的表

库存

  • 姓名

所以要制作杜松子酒和滋补品,我需要库存杜松子酒和滋补品。

如果我只有可乐和滋补品,我应该什么都不退货

这是我到目前为止所得到的,从其他帖子复制/粘贴,但不能再进一步了。

Select
    d.*
From
    drinks d
Where
    not exists (select 1 
                from opskrifter r 
                where r.drink_id = d.drink_id 
                  and r.ingredient_id in (1, 2, 3))

请帮忙:-)

2 个答案:

答案 0 :(得分:3)

您可以使用聚合:

select o.drink_id
from opskrifter o
where r.ingredient_id in (1, 2, 3)
group by o.drink_id
having count(*) = 3;

您可以使用 joininexists——随便——从 drinks 中引入整行。

答案 1 :(得分:1)

<块引用>

我想返回来自 opskrifter 的所有食谱,这些食谱的成分来自另一个名为 stock 的表。

我了解您想要的饮品包含 stock 表中列出的所有成分。假设您在 ingredient_id 中有一个名为 stock 的列,您可以将其表述为:

select o.drink_id
from opskrifter o
inner join stock s on s.ingredient_id = o.ingredient_id
group by o.drink_id
having count(*) = (select count(*) from stock)

或者,如果您想要所有成分都在 stock 中可用的饮料:

select o.drink_id
from opskrifter o
left join stock s on s.ingredient_id = o.ingredient_id
group by o.drink_id
having count(*) = count(s.ingredient_id)
相关问题