Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用group和join从多个表中选择_Mysql_Sql_Database_Count_Inner Join - Fatal编程技术网

Mysql 使用group和join从多个表中选择

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

我有4个标签

饮料、opskrifter、配料和库存

这些表格包括

饮料

  • 饮料
  • 名字
  • 别斯克里夫
  • 玻璃
  • 形象
  • 酒精
望远镜

  • 饮料
  • 成分识别号
  • 数量
配料

  • 成分识别号
  • 名字
股票

  • 成分识别号
  • 名字
我想查询选择饮料,可以在opskrifter的原料库存

我有这个功能,但它只返回饮料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) 
我希望它返回:

饮料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-)