2017-01-09 10 views
1

複数のテーブルを1つのマスター・テーブルに戻す例がたくさんありますが、このクエリはカスケード接続という点で異なります。あなたが見ることができるようにMySQL 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 

、添付ファイルを機会に戻ってリンクし、機会が連絡先に関連しています

は、私は、以下の(容易にするために簡略化)に似た3つのテーブルを持っています。添付ファイルは、機会テーブル以外の連絡先には直接リンクしません。

3つのテーブルすべてのフィールドを含むレコードセットを作成する必要があり、苦労しています。

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

添付ファイルが2回表示されているのはなぜですか?最初の連絡先は「連絡先」であってはなりませんか? (レコードが3つのテーブルすべてに必要であると仮定すれば、これは近いです)。そうでなければ、OUTER結合を使用する必要があります。 – xQbert

+0

LEFT結合を使用しない場合、Johnは添付ファイルの機会がないため除外されます。 LEFT Joinを使用すると、添付ファイルのないJohnの機会を含めることができます。 (このような質問で期待される結果を掲示することは、あなたが何をしているのかをよりよく理解するのに役立ちます)将来の投稿について期待される結果を含めることを検討してください。 – xQbert

答えて

0

私は

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

私はあなたが意味する(そして長期的には読みやすい別名を使用)だと思う

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

...あなたは連絡先が最初のテーブルではない添付ファイルも持っている意味を考えますあなたが3つのテーブルすべてからのフィールドを必要としたので、私はINNER JOINがここで適切であると仮定しています。 OUTER JOINを使用してすべての連絡先を含めることができますか? すべての連絡先とその機会があれば含めます。 CodingHorrorからこのVenn Diagramアプローチに参加するの理解向上のために 、それらが存在するかの場合には機会のために、すべての添付ファイルを含める)

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

は良いスタートです。

+0

ありがとうxQbert - 私はそれを試してみましょう。 –

+0

完璧な - 愚かな間違い - これは扱います。ありがとうございました。 –

+0

すべての連絡先が必要なわけではありません。私はこれをA内のフィールドの検索機能の一部として使用していますが、関連する情報を表示するために2つの親テーブルからデータを取得する必要があります。 –

関連する問題