如何编写 SQL 查询来查找所有包含香蕉的食谱?
你可以这样做:
select distinct r.id, r.name
from recipe r
join recipe_ingredient ri on ri.id_recipe = r.id
join ingredient i on i.id = ri.id_ingredient
where i.name = 'banana'
其次,如果我可以在不创建第三个表的情况下使用 JOIN 查询找到相同的信息,我为什么会有第三个关系表?
由于一个食谱可以有 许多 成分,并且一个成分可以与 许多 食谱相关,因此这两个表之间的关系不是 1:n 而是 n:m。因此,需要一个中间表,如下图:
create table recipe (
id int primary key not null,
name varchar(20)
);
create table ingredient (
id int primary key not null,
name varchar(20)
);
create table recipe_ingredient (
id int primary key not null,
id_recipe int not null,
id_ingredient int not null,
quantity double not null,
foreign key fk1 (id_recipe) references recipe (id),
foreign key fk2 (id_ingredient) references ingredient (id)
);
如果一种成分总是出现在一个配方中,那么结构会更简单,正如您所想的那样。这个更简单的结构可能看起来像:
create table recipe (
id int primary key not null,
name varchar(20)
);
create table ingredient (
id int primary key not null,
name varchar(20),
id_recipe int not null,
foreign key fk3 (id_recipe) references recipe (id)
);
在这种情况下,像这样的模型并不实用。您最终会多次使用相同的成分。例如,如果蛋糕使用“面粉”而面包使用“面粉”,那么“面粉”将在配料表中出现两次。不是个好主意。