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 建模的关系是 多对多 关系。您的示例中的具体数据没有显示出来,但许多不同的语句可能引用同一个词。你所展示的是每个语句可以引用很多单词。
我有这些 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 建模的关系是 多对多 关系。您的示例中的具体数据没有显示出来,但许多不同的语句可能引用同一个词。你所展示的是每个语句可以引用很多单词。