我有这些表格:
词:
+----+------+
| 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"
);
直觉告诉我,我做得那么复杂,但我无法弄清楚并发症的所在。 别扭。
答案 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'
的设置相同。
如何描述这里的关系?一到多少?
由桥表建模的关系是多对多关系。示例中的特定数据未显示,但许多不同的语句可能引用相同的单词。你所做的是每个陈述可以引用很多单词。