簡體   English   中英

Select 來自具有組和連接的多個表

[英]Select from multiple tables with group and join

我有 4 個表

飲料、opskrifter、配料和庫存

這些表格包括

飲料

  • 飲料ID
  • 姓名
  • 別斯克里夫
  • 玻璃
  • 圖片
  • 酒精

opskrifter

  • 飲料ID
  • 成分ID
  • 數量

配料

  • 成分ID
  • 姓名

股票

  • 成分ID
  • 姓名

我想查詢 select 飲料,這些飲料可以在庫存成分的 opskrifter 中制作。

我有這個工作,但它只返回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) 

我希望它返回:

drink_id, 名稱, beskriv, glas, 圖片, 酒精

有人在路上幫助我:-) thx

只需將它們添加到SELECTGROUP 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桌。 我會為此使用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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM