复杂MySQL选择2个外键

时间:2015-05-28 14:58:40

标签: mysql

我正在尝试在3个表之间进行选择。唯一的问题是其中一个表用于解析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

当我进行这些连接时,它会返回Not unique table / alias:' mail_addr'。 我知道这是错的,但我不确定为了解决这个问题我应该寻找甚至是什么。

任何反馈都将不胜感激。

蝰蛇

3 个答案:

答案 0 :(得分:2)

您可以多次加入表,但是您必须为第二个和后续加入别名:

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

答案 1 :(得分: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

答案 2 :(得分: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

如果这不是您所期望的,请编辑您的问题,添加最终结果的示例!