具有 2 个外键的复杂 MySQL 选择

Posted

技术标签:

【中文标题】具有 2 个外键的复杂 MySQL 选择【英文标题】:Complex MySQL select with 2 foreign keys 【发布时间】:2015-05-28 14:58:40 【问题描述】:

我正在尝试在 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'。 我知道这是错误的,但我不确定我应该如何甚至是寻找什么来解决这个查询。

如有任何反馈,我们将不胜感激。

毒蛇

【问题讨论】:

Why does this SQL code give error 1066 (Not unique table/alias: 'user')?的可能重复 【参考方案1】:

您可以多次连接一个表,但您必须为第 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

【讨论】:

【参考方案3】:

我不明白这是否是您想要达到的结果,但这应该可以工作(基于您的示例查询)

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 个外键的复杂 MySQL 选择的主要内容,如果未能解决你的问题,请参考以下文章

创建具有主键和2个外键的表

休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?

具有 2 个外键实体框架的表

从具有三个外键的表中选择一个表[关闭]

Laravel中带有2个外键的搜索栏

Mysql