查询联结表中FK引用的表中的其他字段

Posted

技术标签:

【中文标题】查询联结表中FK引用的表中的其他字段【英文标题】:Query other fields in tables referenced by FK in junction table 【发布时间】:2020-02-18 20:25:35 【问题描述】:

我有一个“联结”表 (recipe_ingredients),用于处理数据库中的多对多关系。该表中的每个字段都是对另一个表的 PK 的引用:recipe_idingredient_idquantity_idmeasure_id。这些是 metadataingredientsquantitiesmeasurements 表的 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 joinjoin 实际上是同义词(它们的作用完全相同)。你可能参考了left join,它不会排除join右侧的不匹配记录。

以上是关于查询联结表中FK引用的表中的其他字段的主要内容,如果未能解决你的问题,请参考以下文章

如何查询具有基数的表以显示所有 Pk,同时还显示具有 FK 的表中的匹配元素

连接查询

在引用其他表时在单个表上使用Delete查询

MySQL8:连接查询

多对多关联表PK作为其他表中的FK

从 2 个联结表中提取数据的查询