Select 来自多个表的分组和连接
Select from multiple tables with group and join
我有 4 个表格
饮料、opskrifter、配料和库存
表格包括
饮料
- drink_id
- 名字
- 关注
- 玻璃
- 图片
- 酒精
opskrifter
- drink_id
- ingredient_id
- 数量
成分
- ingredient_id
- 名字
现货
- ingredient_id
- 姓名
我想查询 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)
基本上drink
table需要带上。我会为此使用 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
我有 4 个表格
饮料、opskrifter、配料和库存
表格包括
饮料
- drink_id
- 名字
- 关注
- 玻璃
- 图片
- 酒精
opskrifter
- drink_id
- ingredient_id
- 数量
成分
- ingredient_id
- 名字
现货
- ingredient_id
- 姓名
我想查询 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)
基本上drink
table需要带上。我会为此使用 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