查询联结表中FK引用的表中的其他字段
Posted
技术标签:
【中文标题】查询联结表中FK引用的表中的其他字段【英文标题】:Query other fields in tables referenced by FK in junction table 【发布时间】:2020-02-18 20:25:35 【问题描述】:我有一个“联结”表 (recipe_ingredients
),用于处理数据库中的多对多关系。该表中的每个字段都是对另一个表的 PK 的引用:recipe_id
、ingredient_id
、quantity_id
和 measure_id
。这些是 metadata
、ingredients
、quantities
和 measurements
表的 PK。除了 metadata
表之外,所有这些表都只有两个字段:PK 以及与该 PK 关联的名称或编号。
我正在尝试查询 recipe_ingredients
以获取具有给定 recipe_id
... 的所有行,但我不想显示带有 recipe_id
的每一行中的 PK,而是显示与关联的名称/编号那个表中的那个PK。
所以不是返回这个的查询:
recipe_id | ingredient_id | quantity_id | measure_id
----------+---------------+-------------+-----------
1 | 10 | 2 | 3
----------+---------------+-------------+-----------
1 | 12 | 2 | 3
----------+---------------+-------------+-----------
1 | 13 | 5 | 6
----------+---------------+-------------+-----------
...
我正在寻找返回如下内容的查询:
recipe_id | ingredient_name | quantity_num | measure_num
----------+-----------------+--------------+------------
1 | Ground cayenne | 1/2 | tsp
----------+-----------------+--------------+------------
1 | Ground paprika | 1/2 | tsp
----------+-----------------+--------------+------------
1 | Olive oil | 1 | tbsp
----------+-----------------+--------------+------------
...
我刚开始学习 SQL,所以我只知道如何对单个表进行简单的查询。我什至不知道从哪里开始这个查询,除了我可能需要一种join
语句。我可以编写什么查询来实现这一点?
我在 Debian 上使用 sqlite3
。
recipe_ingredients“联结”表:
CREATE TABLE recipe_ingredients (
recipe_id int,
ingredient_id int,
quantity_id int,
measure_id int,
primary key (recipe_id, ingredient_id),
foreign key (recipe_id)
references metadata (recipe_id)
on update restrict
on delete restrict,
foreign key (ingredient_id)
references ingredients (ingredient_id)
on update restrict
on delete restrict,
foreign key (quantity_id)
references quantities (quantity_id)
on update restrict
on delete restrict,
foreign key (measure_id)
references measurements (measure_id)
on update restrict
on delete restrict
);
这些是联结表引用的外部表:
create table if not exists ingredients (
ingredient_id integer primary key,
ingredient_name text not null
);
create table if not exists quantities (
quantity_id integer primary key,
quantity_num int not null
);
create table if not exists measurements (
measure_id integer primary key,
measure_name text not null
);
create table if not exists metadata (
recipe_id integer primary key,
recipe_name text not null,
course_id int,
cuisine_id int,
servings int,
prep_time int,
cook_time int,
total_time int,
foreign key (course_id)
references courses (course_id)
on update restrict
on delete restrict,
foreign key (cuisine_id)
references cuisine (cuisine_id)
on update cascade
on delete cascade
);
【问题讨论】:
你一定在一些介绍的例子中看到过这个。它也是重复的。这是一个基本问题。在考虑发布之前,请始终在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 【参考方案1】:您可以join
联结表与每个相关表,如下所示:
select
ri.recipe_id,
i.ingredient_name,
q.quantity_num,
m.measure_num
from recipe_ingredients ri
inner join ingredients i on i.ingredient_id = ri.ingredient_id
inner join quantities q on q.quantity_id = ri.quantity_id
inner noin measurements m on m.measure_id = ri.measure_id
where ri.recipe_id = ?
问号 (?
) 代表您要查找的 recipe_id
。
【讨论】:
这行得通,谢谢!我是否只使用inner join
而不是join
,以便查询只返回两个表中的匹配数据?
@NickolasPeterO'Malley: inner join
和 join
实际上是同义词(它们的作用完全相同)。你可能参考了left join
,它不会排除join
右侧的不匹配记录。以上是关于查询联结表中FK引用的表中的其他字段的主要内容,如果未能解决你的问题,请参考以下文章