0

私は3つのテーブルの結合に取り組んでいます。

table1.
grp_id | email_id
   1   |  3 
   1   |  58

table2.
sam_msg_id | sam_subject
   3       |  Funnel

table3.
id | subject
58 | testing check


Desired Output:

id |grp_id|email_id|sam_subject|subject      |
184|1     |3       |funnel     |             |
185|1     |58      |           |testing check|

私が試したクエリ:

SELECT table1.*, table2.sam_subject, table3.* 
FROM table1
INNER JOIN table2 
    ON table2.sam_msg_id = table1.email_id 
INNER JOIN table3 
    ON table3.id = table1.email_id 
WHERE table1.grp_id = '1' 

ここで私がやろうとしているのは、サブジェクトとそのIDのリストをtable2とtable3から取得することです。ここで、idはemail_idの下のtable1にあります。

table2のデータのみをチェックするだけで、1つの内部結合でそれを実行しようとすると、機能していました。

私は内部結合の使用に慣れていないため、何が間違っているのかを実際に確認することはできません。

MySQLを使用しています。

4

2 に答える 2

3

必要なようですねLEFT JOIN

SELECT table1.*, table2.sam_subject, table3.* 
FROM table1
LEFT JOIN table2 
    ON table2.sam_msg_id = table1.email_id 
LEFT JOIN table3 
    ON table3.id = table1.email_id 
WHERE table1.grp_id = '1' 

編集に基づいて、以下はあなたが望む結果を与えるはずです:

SELECT t1.grp_id, 
  t1.email_id, 
  coalesce(t2.sam_subject, '') sam_subject, 
  coalesce(t3.subject, '') subject
FROM t1
left JOIN t2 
    ON t2.sam_msg_id = t1.email_id 
left JOIN t3 
    ON t1.email_id = t3.id
WHERE t1.grp_id = '1' 

SQL FiddlewithDemoを参照してください

于 2012-08-13T21:29:53.903 に答える
1

私はあなたが何を求めているのか少し混乱しています。現在のデータと希望する出力の例を提供できれば、おそらく解決策を突き止めることができます。

現状では、を読む必要があると思います。これは、子テーブルに一致するレコードがない場合に LEFT JOIN返されます。一致するものがない場合、レコードは返されません。NULLINNER JOIN

さまざまなタイプの結合の説明については、この記事を参照してください。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

アップデート:

目的の結果の最初の列がどこから来るのかわかりませんが、以下のクエリで目的の結果が得られるはずです。

SELECT t1.*, t2.sam_subject, t3.subject
FROM Table1 as t1
LEFT JOIN table2 as t2
on t1.email_id = t2.sam_msg_id
LEFT JOIN table3 as t3
on t1.email_id = t3.id
于 2012-08-13T21:29:58.513 に答える