mysql - 如何使用父表中的值将连接表连接到另一个连接表?

Posted

技术标签:

【中文标题】mysql - 如何使用父表中的值将连接表连接到另一个连接表?【英文标题】:mysql - How to join junctional table to another junctional table with values from parent tables? 【发布时间】:2018-11-14 22:08:51 【问题描述】:

不知道如何在标题中正确写出问题,但我会尝试解释我想要实现的目标。

这些是我的父表:

 hgs_meaning         hgs_word_types        hgs_transliterations
 +----+---------+    +----+-----------+    +----+-----------------+
 | id | meaning |    | id | word_type |    | id | transliteration |
 +----+---------+    +----+-----------+    +----+-----------------+
 | 3  | man     |    | 4  | noun      |    | 5  | mnjw            |
 +----+---------+    +----+-----------+    +----+-----------------+

这些是我的联结表:

 junc_meaning_word_type
 +----+------------+--------------+
 | id | meaning_id | word_type_id |
 +----+------------+--------------+
 | 2  | 3          | 4            |
 +----+------------+--------------+

 junc_transliteration_meaning_word_type
 +----+--------------------+----------------------+
 | id | transliteration_id | meaning_word_type_id |
 +----+--------------------+----------------------+
 | 1  | 5                  | 2                    |
 +----+--------------------+----------------------+

我知道如何进行SELECT JOIN 查询以获取junc_meaning_word_type 表的结果,但不知道junc_transliteration_meaning_word_type 的结果

我知道如何得到这个结果:

 +----+-----------------+-------------------+
 | id | transliteration | meaning_word_type |
 +----+-----------------+-------------------+
 | 1  | mnjw            | 2                 |
 +----+-----------------+-------------------+

我正在努力实现这个结果:

 +----+--------------------+------------+--------------+
 | id | transliteration_id | meaning_id | word_type_id |
 +----+--------------------+------------+--------------+
 | 1  | mnjw               | man        | noun         |
 +----+--------------------+------------+--------------+

如何做到这一点。我猜我需要使用嵌套的SELECT查询(子查询)或多个JOINs,但我不知道如何构造这样的查询。

这是我的疑问:

/* hgs_meanings and hgs_word_types join to junc_meaning_word_type */

SELECT junc_meaning_word_type.id, hgs_word_types.word_type, hgs_meanings.meaning
FROM junc_meaning_word_type
JOIN hgs_word_types ON junc_meaning_word_type.word_type_id = hgs_word_types.id
JOIN hgs_meanings ON junc_meaning_word_type.meaning_id = hgs_meanings.id 

/* hgs_transliterations and junc_meaning_word_type join to junc_transliteration_meaning */

SELECT junc_transliteration_meaning.id, hgs_transliterations.transliteration, junc_meaning_word_type.id
FROM junc_transliteration_meaning
JOIN hgs_transliterations ON junc_transliteration_meaning.transliteration_id = hgs_transliterations.id
JOIN junc_meaning_word_type ON junc_transliteration_meaning.meaning_word_type_id = junc_meaning_word_type.id

任何帮助将不胜感激。

【问题讨论】:

你在正确的轨道上。连接可以引用任何先前的表,它不必是之前的表。继续JOINS 结果中的id列来自哪个表? 如果所有表格中都没有id = 1,这个例子会更容易理解。 请根据业务情况和/或基表中的哪些行,用文字说明一行满足什么标准作为结果。请提供更具代表性的数据——这对我们来说是非常少的猜测。请对minimal reproducible example 的其余部分采取行动。 PSRequired to join 2 tables with their FKs in a 3rd tableIs there any rule of thumb to construct SQL query from a human-readable description? 我用其他数字更新了表格,以便更容易理解。 【参考方案1】:

您可以简单地JOIN 所有表连同其适当的联接关系,然后SELECT 您需要的特定列/表达式。您还可以为 SELECT 子句中指定的列/表达式命名,以显示不同的名称。

同样,为了代码清晰(可读性)和避免模棱两可的行为,建议在表名上使用Aliasing,以防多表查询。

SELECT junctrans.id, 
       trans.transliteration AS transliteration_id, 
       mean.meaning AS meaning_id, 
       typ.word_type AS word_type_id 
FROM 
  junc_transliteration_meaning_word_type AS junctrans
JOIN junc_meaning_word_type AS juncmean 
  ON juncmean.id = junctrans.meaning_word_type_id 
JOIN hgs_transliterations AS trans
  ON trans.id = junctrans.transliteration_id 
JOIN hgs_meaning AS mean 
  ON mean.id = juncmean.meaning_id 
JOIN hgs_word_types AS typ 
  ON typ.id = juncmean.word_type_id 

【讨论】:

效果很好。非常感谢你。我将分析您的代码以更好地理解它。

以上是关于mysql - 如何使用父表中的值将连接表连接到另一个连接表?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:如何在注释中将三个 3 表连接到一个连接表中?

使用另一个表laravel中的当前值插入数据?

MYSQL UPDATE 查询多个值

如何将表连接到联合查询的结果

编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中

我想要一个 pandas 脚本根据第一个电子表格中的值将一个 excel 表中的值排列到另一个表中