2017-01-09 10 views
1

Я видел множество примеров для объединения нескольких таблиц обратно в одну главную таблицу, но этот запрос отличается тем, что он каскадирует.MySQL Присоединиться к 3 каскадным таблицам

У меня есть 3 таблицы, аналогичные приведенным ниже (упрощена для удобства):

**CONTACTS**  
-------------------------------------------- 
Cid name 
-------------------------------------------- 
1  John 
2  Peter 
3  Karl 


**OPPORTUNITIES** 
-------------------------------------------- 
Oid Cidlink title 
-------------------------------------------- 
1  2   php lookup script 
2  2   php facial recognition 
3  3   html email template 
4  1   javascript verification 

**ATTACHMENTS** 
-------------------------------------------- 
Aid Oidlink attachment 
-------------------------------------------- 
1  3   received enquiry 
2  3   header and footer done 
3  3   pixel trace image done on server 
4  2   database structure done  
5  2   html get form done 

Как вы можете видеть, вложения ссылку Вернуться к возможностям и возможностям относятся к контактам. Вложения не привязываются напрямую к контактам, за исключением таблицы возможностей.

Мне нужно создать набор записей, включая поля из всех трех таблиц, и я боюсь.

SELECT CONTACTS.*, OPPORTUNITIES.*, ATTACHMENTS.* 
FROM ATTACHMENTS 
    INNER JOIN OPPORTUNITIES 
     ON CONTACTS.Cid = OPPORTUNITIES.Cidlink 
    INNER JOIN ATTACHMENTS 
     ON OPPORTUNITIES.Oid = ATTACHMENTS.Oidlink 

ORDER BY ****whatever**** 

Я закрываю или приближаюсь к этому неправильно?

+0

Почему у вас есть вложения, перечисленные дважды? не должен ли первый быть «контактами»? (и да, это близко, если запись должна быть во всех трех таблицах, чтобы она вам понадобилась.) В противном случае вам нужно использовать соединения OUTER. – xQbert

+0

Джон был бы исключен, если вы не используете LEFT join, поскольку у него нет возможностей с вложениями. Используя LEFT Join, вы можете включить возможность Джона без вложений. (Обратите внимание, что публикация ожидаемых результатов в таких вопросах помогает нам лучше понять, что вам нужно. Подумайте, включая ожидаемые результаты в будущих сообщениях!) Это помогает рассказать историю о том, чего вы пытаетесь достичь. – xQbert

ответ

0

Я думаю, что вы имеете в виду, чтобы иметь контакты быть первой таблицы не вложения ...

SELECT CONTACTS.*, OPPORTUNITIES.*, ATTACHMENTS.* 
FROM ATTACHMENTS --- This is wrong 
INNER JOIN OPPORTUNITIES 
    ON CONTACTS.Cid = OPPORTUNITIES.Cidlink 
INNER JOIN ATTACHMENTS 
    ON OPPORTUNITIES.Oid = ATTACHMENTS.Oidlink 
ORDER BY ****whatever**** 

Я думаю, что вы имеете в виду (и использовать псевдонимы легче читать в долгосрочной перспективе)

SELECT C.*, O.*, A.* 
FROM Contacts C 
INNER JOIN OPPORTUNITIES O 
    ON C.Cid = O.Cidlink 
INNER JOIN ATTACHMENTS A 
    ON O.Oid = A.Oidlink 
ORDER BY ****whatever**** 

Поскольку вы указали, что вам нужны поля из всех трех таблиц, я предполагаю, что INNER JOIN уместен здесь; но, возможно, вы хотите использовать OUTER JOIN для включения всех контактов? Включите все контакты и их возможности, если они существуют. и включает в себя все приложения для возможности, если, если они существуют)

SELECT C.*, O.*, A.* 
FROM Contacts C 
LEFT JOIN OPPORTUNITIES O 
    ON C.Cid = O.Cidlink 
LEFT JOIN ATTACHMENTS A 
    ON O.Oid = A.Oidlink 
ORDER BY ****whatever**** 

Для лучшего понимания объединений этого Venn Diagram подхода от CodingHorror является хорошим началом.

+0

Спасибо xQbert - я попробую. –

+0

Perfect - глупая ошибка - это работает. Спасибо. –

+0

Не все контакты нужны, и не все возможности. Я использую это как часть функции поиска по полям в пределах A. *, но вам нужно захватить данные из двух родительских таблиц, чтобы отобразить соответствующую информацию. –

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

  • Нет связанных вопросов^_^