Mysql 使用group和join从多个表中选择
我有4个标签 饮料、opskrifter、配料和库存 这些表格包括 饮料Mysql 使用group和join从多个表中选择,mysql,sql,database,count,inner-join,Mysql,Sql,Database,Count,Inner Join,我有4个标签 饮料、opskrifter、配料和库存 这些表格包括 饮料 饮料 名字 别斯克里夫 玻璃 形象 酒精 望远镜 饮料 成分识别号 数量 配料 成分识别号 名字 股票 成分识别号 名字 我想查询选择饮料,可以在opskrifter的原料库存 我有这个功能,但它只返回饮料id select o.drink_id from opskrifter o left join stock s on s.ingredient_id = o.ingredient_id group
- 饮料
- 名字
- 别斯克里夫
- 玻璃
- 形象
- 酒精
- 饮料
- 成分识别号
- 数量
- 成分识别号
- 名字
- 成分识别号
- 名字
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)
我希望它返回:
饮料id、名称、别斯克里夫、玻璃、图像、酒精
有人在路上帮助我:-)thx只需将它们添加到
选择后的列表中,然后添加到分组中即可
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\u id
是一个键,那么在groupby
子句中只列出drink\u 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)
基本上,您需要带上饮料桌。在将聚合查询转换为子查询时,我只需要使用一个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
我不明白-你是在寻找使用所有库存成分的饮料吗?看,是的,我在寻找所有库存成分的饮料。上面的查询正在运行,我只想从中返回更多信息,而不仅仅是饮料id。我想要姓名等。。从饮料桌上。我就是不知道怎么做?把你的查询放到cte中,然后在主查询中加入你需要的其他表。这很好用:-)thx alot man-)