Select 来自多个表的分组和连接

Select from multiple tables with group and join

我有 4 个表格

饮料、opskrifter、配料和库存

表格包括

饮料

opskrifter

成分

现货

我想查询 select 可以在库存成分的 opskrifter 中制作的饮料。

我有这个工作,但它只有 returns drink_id。

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) 

我要return:

drink_id,姓名,beskriv,眼镜,图片,酒精

有人在路上帮助我 :-) 谢谢

只需将它们添加到 SELECT 之后的列表和 GROUP BY

SELECT o.drink_id,
       o.name,
       o.beskriv,
       o.glas,
       o.image,
       o.alcohol
...
       GROUP BY o.drink_id,
                o.name,
                o.beskriv,
                o.glas,
                o.image,
                o.alcohol
...

如果 drink_id 是键,在 GROUP BY 子句中仅列出 drink_id 可能就足够了。

我不认为你的查询有效,你应该计算使用的成分数量和存在的数量,你可以使用 cte 然后加入例如

DROP TABLE IF EXISTS drinks,OPSKRIFTER,ingredients,stock;
create table drinks
(drink_id int,
name varchar(3),
beskriv int,
glas int,
image varchar(10),
alcohol int
);
create table opskrifter
(drink_id int,
ingredient_id int,
quantity int
);

create table ingredients
(ingredient_id int,
name varchar(3)
);

create table stock
(ingredient_id int,
name varchar(3)
);

insert into drinks(drink_id,name) values (1,'n1'),(2,'n2');
insert into opskrifter values (1,1,10),(1,2,10),(2,1,20);
insert into stock values(1,'i1'),(2,'I2');

with cte as
(
select o.drink_id,count(*) cnt,(Select count(*) from stock) sn
from opskrifter o
group by o.drink_id having cnt = sn
)
select drinks.drink_id,drinks.name
from cte
join drinks on drinks.drink_id = cte.drink_id;

+----------+------+
| drink_id | name |
+----------+------+
|        1 | n1   |
+----------+------+
1 row in set (0.00 sec)

基本上drinktable需要带上。我会为此使用 join,同时将聚合查询转换为子查询:

select d.*, o.cnt_ingredients
from drink d
inner join (
    select o.drink_id, count(*) as cnt_ingredients
    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) 
) o on o.drink_id = d.drink_id