MySQL如何通过桥接表更好地查询连接两个表?

时间:2016-07-07 22:59:21

标签: mysql database bridge select-query

我有这些表格:

词:

+----+------+
| 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 |
+----+------+

和一个桥接表连接表格中的单词"单词"使用表格中的数据"语句":

桥:

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

我想获得一个SELECT QUERY来获取与语句相关的所有单词" 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"
 );

直觉告诉我,我做得那么复杂,但我无法弄清楚并发症的所在。 别扭。

1 个答案:

答案 0 :(得分:1)

我喜欢将主键命名为引用它们的列。因此,在您的示例中,在words表中,您将命名主键ID_word。在statements表格中,您可以将主键命名为ID_statement

优点是您可以使用USING(...)语法使SQL连接更简洁。此语法假定在连接的两个表中都有一个按该名称列的列,并且您希望连接匹配列等于另一个表中的同一列的位置。

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

此外,您不需要在示例中运行子查询。语句中的行与语句中的行的ID匹配,其中DATA='ja'与语句中的行DATA='ja'的设置相同。

  

如何描述这里的关系?一到多少?

由桥表建模的关系是多对多关系。示例中的特定数据未显示,但许多不同的语句可能引用相同的单词。你所做的是每个陈述可以引用很多单词。