2016-07-07 3 views
2

У меня есть эти таблицы:MySQL Как я могу сделать лучший запрос для подключения двух таблиц через мою таблицу мостов?

слово:

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

другой вопрос, но немного не по теме: как бы описать здесь отношения? один ко многим? отношения между словами и утверждениями кажутся одними для многих (только одно утверждение подходит ко многим словам, которые могут быть синонимами). Единственное, что я узнал только о таблицах моста в контексте отношений «многие ко многим». мой дизайн db ошибочен таким образом? – gauguerilla

ответ

1

Мне нравится называть первичные ключи такими же, как столбцы, ссылающиеся на них. Итак, в вашем примере, в таблице words, вы должны указать первичный ключ ID_word. В таблице statements вы должны указать первичный ключ ID_statement.

Преимущество состоит в том, что вы можете сделать ваш SQL-код немного более лаконичным с синтаксисом USING(...). Этот синтаксис предполагает наличие столбца этого имени в обеих таблицах соединения, и вы хотите, чтобы соединение соответствовало тому, где столбец равен одному и тому же столбцу в другой таблице.

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

Также вам не нужно запускать подзапрос в вашем примере. Строки в выражении, совпадающие с идентификаторами из строк в инструкции, где DATA='ja' совпадают с строками в инструкции, где DATA='ja'.

как можно описать отношения здесь? один ко многим?

Отношения смоделированы с помощью таблицы моста является отношения многие-ко-многим. Конкретные данные в вашем примере не показывают этого, но вполне возможно, что многие разные операторы могут ссылаться на одно и то же слово. То, что вы показываете, - это то, что каждое утверждение может ссылаться на многие слова.

+0

thx. что помогло много и действительно облегчает мою жизнь. Я никогда не получал синтаксис USING. об обозначении отношений: значит, вы должны описывать отношения таблицы, а не отношения данных? или он изменится, когда я определю ID_words в таблице моста в качестве Первичного ключа (который пока будут доступны в моих примерах)? – gauguerilla

+1

@gauguerilla: Если строка в словах может быть связана не более чем с одной строкой 'statement', это отношение« один ко многим », а таблица« мост »не требуется.Вместо этого вы могли бы добавить столбец/ограничение внешнего ключа в таблицу 'words', ссылаясь на первичный ключ таблицы' statements'. Если строка в 'words' не связана с строкой в' statement', тогда присвойте значение NULL столбцу внешнего ключа. Эта конструкция будет удовлетворять данным примера. Но, как отметил Билл, мы не можем сделать решимость, что это отношения «один ко многим». (Отсутствие встречного примера недостаточно.) – spencer7593

+0

Что сказал @ spencer7593. –

Смежные вопросы