我有几张桌子:
文字:
+----+------+
| 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 |
+----+------+以及将表中的单词“word”与表“语句”中的数据连接起来的桥接表:
桥牌:
+--------------+---------+
| 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"
);直觉告诉我,我做了那么多事情,但我不知道复杂的地方在哪里。很尴尬。
发布于 2016-07-07 23:08:06
我喜欢将主键命名为引用它们的列。因此,在您的示例中,在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';而且,您不需要在示例中运行子查询。语句中的行与语句中的行( DATA='ja'与语句中的行( DATA='ja' )相同)中的in相匹配。
这里的关系是怎样描述的?一对多?
由桥表建模的关系是多到多的关系。示例中的特定数据没有显示出来,但是很多不同的语句都可能引用同一个单词。你要做的是,每个陈述都可以引用许多单词。
https://stackoverflow.com/questions/38256570
复制相似问题