2015-05-28 29 views
2

我正試圖做3個表之間的選擇。唯一的問題是其中一個表用於解析2個不同表上的外鍵。表格的簡短描述可以在下面找到。我刪除了一些列,以便只顯示相關的列。複雜的MySQL選擇與2個外鍵

mail_addr 
+------------+ 
| id   | 
+------------+ 
| email  | 
+------------+ 

msg_rcpt 
+------------+ 
|MsgID  | 
+------------+ 
|rid   | 
+------------+ 
|content  | 
+------------+ 

msgs 
+------------+ 
|MsgID  | 
+------------+ 
|sid   | 
+------------+ 
|msgTime  | 
+------------+ 
|size  | 
+------------+ 

我試圖...

SELECT msg_rcpt.MsgID, msg_rcpt.content, mail_addr.email as rcpt_addr, msgs.msgTime 
FROM msg_rcpt 
JOIN msgs ON msgs.MsgID = msg_rcpt.MsgID 
JOIN mail_addr ON msg_rcpt.rid = mail_addr.id 
JOIN mail_addr ON msgs.sid = mail_addr.id 

當我做這些加入它回來了不是唯一的表/別名: 'mail_addr'。 我知道這是錯誤的,但我不確定如何甚至我應該尋找什麼來解決這個查詢。

任何反饋將不勝感激。

蝰蛇

+0

可能的重複[爲什麼這個SQL代碼給錯誤1066(不唯一的表/別名:'用戶')?](http://stackoverflow.com/questions/1435177/why-does-this-sql-code -give錯誤-1066-不是唯一表的別名用戶) – Timo

回答

2

您可以加入一個表多次,但你必須別名第二及後續加入:

JOIN mail_addr ON msg_rcpt.rid = mail_addr.id 
JOIN mail_addr AS someaslias ON msgs.sid = somealias.id 
       ^^^^^^^^^^^^^    ^^^^^^^^^ 
2

如果你想在同一個表連接兩次,你就會有使用別名(至少有一個,但兩個別名會使事情更清晰)。

SELECT msg_rcpt.MsgID, msg_rcpt.content, m1.email as rcpt_addr, msgs.msgTime 
FROM msg_rcpt 
JOIN msgs ON msgs.MsgID = msg_rcpt.MsgID 
JOIN mail_addr m1 ON msg_rcpt.rid = m1.id 
JOIN mail_addr m2 ON msgs.sid = m2.id 
0

我不明白,如果這是你想要達到的結果,但這應該工作(根據您的示例查詢)

SELECT msg_rcpt.MsgID, msg_rcpt.content, m1.email as rcpt_addr, msgs.msgTime 
FROM msg_rcpt JOIN msgs ON msgs.MsgID = msg_rcpt.MsgID 
JOIN mail_addr m1 ON msg_rcpt.rid = m1.id 
JOIN mail_addr m2 ON msgs.sid = m2.id 

如果這不是你期待什麼,請編輯你的問題添加最終結果的例子!