【问题标题】:MySQL outer-join with joined-table having dependencies to more than one tableMySQL 外连接与连接表具有对多个表的依赖关系
【发布时间】:2012-02-02 15:10:51
【问题描述】:

我有 3 张桌子 A、B 和 T

T 分别持有表 A 和 B 的外键。

现在我想获取 (A,B,T) 的所有行,即使 T 为空。

SELECT * from

A
LEFT OUTER JOIN T t1 ON t1.A_ID = A.id,
B
LEFT OUTER JOIN T t2 ON t2.B_ID = B.id

WHERE A.B_ID = B.ID

现在的问题是我得到了太多的行,所以我添加了以下内容:

AND t1.id = t2.id

但现在我根本没有得到任何行,这是我首先试图通过包含 LEFT OUTER JOIN 来避免的。

编辑:除了任何示例数据或表格布局之外,我的问题仅仅是,在这种情况下,A + B 是否需要 2 个左外部联接,如上所示或者也许还有另一种方式?

像某些用户建议的那样,在第二个左连接中仅引用表 A 无法正常工作,因为它超出了范围,也解释了 here
因此,如果您将两个表都用括号括起来,它就可以工作:

SELECT * from (A, B)
LEFT OUTER JOIN T t ON t.A_ID = A.id and t.B_ID = B.id

【问题讨论】:

  • 我可能理解错了,但是 A.B_ID = B.ID 的目的是什么?您能否发布表定义和示例数据?
  • 为了您自己的理智(在某种程度上,我们的理智),请不要混合使用 ,JOIN 符号。尝试使用一个,最好是JOIN。此外,您可以 () 查询部分内容,例如 (A LEFT JOIN T ON ???) INNER JOIN (B LEFT JOIN T ON ???) ON ???
  • 如果这两个表没有任何关系,我们如何使用“on A.B_ID = B.ID”?您给出了“T 持有表 A 和 B 的外键”。
  • 您能否提供更多信息 - 表结构和您的预期输出。从问题中不清楚A和B是否相关。如果没有,你想要笛卡尔积吗?

标签: mysql sql join left-join


【解决方案1】:

试试这个查询: 如果 A 和 B 没有任何关系:

SELECT * FROM
(A, B)
LEFT OUTER JOIN T ON T.A_ID = A.id
AND T.B_ID = B.id

如果A和B有关系,最后添加这一行:

WHERE A.B_ID = B.ID

【讨论】:

  • 我不认为这可以工作,因为 A.id 在外部连接中是“未知的”。您在表 A 之后声明表 B
  • 我已经测试过了。有用。如果你的表结构是你给的。
  • 如果我用括号 => (A, B) 包围 A、B,您的解决方案将有效。也许这在 MySQL 中是必须的
  • 哦...对不起..谢谢。我改变了我的解决方案。括号应该在那里。
【解决方案2】:

试试

select *
from A
join B on A.B_ID = B.ID
left join T on T.A_ID = a.id and T.B_ID = b.id

.. 假设我正确理解了您的问题,并且您打算在 A 和 B 之间进行常规的内部连接

【讨论】:

  • 如果这两个表没有任何关系,我们如何使用“on A.B_ID = B.ID”? “T 持有表 A 和 B 的外键”。
  • 原问题中的WHERE 子句暗示了A 和B 之间的关系
  • +1,虽然我有点不确定第二个ON 子句是否应该将两个比较与ANDOR 联系起来。
【解决方案3】:

如果我理解正确,那么也许这对你有用?

SELECT * from
A
LEFT OUTER JOIN T t1 ON t1.A_ID = A.id,
B
LEFT OUTER JOIN T t2 ON (t2.B_ID = B.id AND t1.id = t2.id)

WHERE A.B_ID = B.ID

【讨论】:

  • 这是问题,我正在努力解决:t1.id is unknown in the second LEFT OUTER JOIN.
  • OOps,对不起,没有注意到逗号...也许然后 SELECT * from A LEFT OUTER JOIN T t1 ON t1.A_ID = A.id LEFT OUTER JOIN B ON (t1.B_ID = B.id AND A.B_ID = B.ID) 会有所帮助
  • 但是,AB 之间有什么关系?
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2012-06-15
  • 2016-11-10
  • 2022-09-23
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2019-08-22
相关资源
最近更新 更多