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