MySQL 如何更好地查询通过我的网桥 table 连接两个 table?

MySQL How can I make a better query to connect two tables through my bridge table?

我有这些 table:

字数:

+----+------+
| ID | DATA |
+----+------+
|  1 | jo   |
|  2 | yes  |
|  3 | jupp |
|  4 | yeah |
|  5 | jepp |
|  6 | joah |
|  7 | ne   |
|  8 | nee  |
|  9 | no   |
| 10 | nope |
| 11 | nah  |
+----+------+

陈述:

+----+------+
| ID | DATA |
+----+------+
|  1 | ja   |
|  2 | nein |
+----+------+

和一座桥梁 table,将 table "words" 中的单词与 table "statements" 中的数据连接起来:

桥梁:

+--------------+---------+
| ID_statement | ID_word |
+--------------+---------+
|            1 |       1 |
|            1 |       2 |
|            1 |       3 |
|            1 |       4 |
|            1 |       6 |
|            2 |       8 |
|            2 |       9 |
+--------------+---------+

我想要一个 SELECT 查询来获取与语句 "ja".

关联的所有单词

这个查询完成了工作,但似乎比应该的更复杂:

SELECT words.DATA FROM words 
 JOIN bridge ON words.ID = bridge.ID_word 
 JOIN statements ON statements.ID = bridge.ID_statement 
 WHERE statements.ID = (
 SELECT ID FROM statements WHERE statements.DATA = "ja"
 );

直觉告诉我,我做的太复杂了,但我想不出复杂的地方。 尴尬。

我喜欢将主键命名为与引用它们的列相同的名称。因此,在您的示例中,在 words table 中,您将主键命名为 ID_word。在 statements table 中,您将主键命名为 ID_statement.

优点是您可以使用 USING(...) 语法使 SQL 连接更加简洁。此语法假定在联接的两个 table 中都有一个同名的列,并且您希望联接匹配该列与另一个 table.[=19= 中的同一列相同的位置。 ]

SELECT words.DATA FROM words 
 JOIN bridge USING (ID_word) 
 JOIN statements USING (ID_statement) 
 WHERE statements.DATA = 'ja';

此外,您不需要 运行 示例中的子查询。语句中与 DATA='ja' 中行的 ID 匹配的行与语句中 DATA='ja'.

中行的集合相同

how would one describe the relationship here? one-to-many?

桥 table 建模的关系是 多对多 关系。您的示例中的具体数据没有显示出来,但许多不同的语句可能引用同一个词。你所展示的是每个语句可以引用很多单词。