2012-01-04 57 views
3

我有3个表A,B和TMySQL外连接表与多个表有依赖关系

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 

但现在我根本拿不出行通过包括我试图避免在首位左外连接。

编辑:除了任何示例数据或表格布局我的问题是仅仅如果一个表T与外键关系依赖关系到超过一个表在这种情况下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 
+2

我可能有误解,但是A.B_ID = B.ID的目的是什么?你可能会张贴表格定义和样本数据吗? – 2012-01-04 18:00:06

+0

你可能想尝试这样的事情: http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – 2012-01-04 18:04:37

+0

为了您自己的理智(在某种程度上,我们的),请不要混合','和'JOIN'表示法。尝试使用一个,最好是'JOIN'。另外,你可以()将你的查询的一部分,例如'(A LEFT JOIN T ON ???)INNER JOIN(B LEFT JOIN T ON ???)ON ???' – MatBailie 2012-01-04 18:10:45

回答

3

尝试此查询: 如果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 
+0

我不认为这可以工作,因为A.id在外连接中是“未知的”。您正在陈述表B-A AFTER表-A – recalcitrant 2012-01-04 18:34:35

+0

我已测试过它。有用。如果你的表结构是你给的。 – 2012-01-04 18:39:11

+0

如果我用parens =>(A,B)环绕A,B,则您的解决方案有效。也许这是MySQL – recalcitrant 2012-01-04 19:07:01

3

尝试

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

之间的连接
+0

如果这两个表格没有任何关系,我们如何使用“在A.B_ID = B.ID”上? “T拥有表A和B的外键”。 – 2012-01-04 18:16:58

+2

原始问题中的WHERE子句暗示了A和B之间的关系 – rejj 2012-01-04 18:19:08

+0

+1,但我有点不确定第二个“ON”子句应该将这两个比较与AND和OR或者OR连接起来。 – 2012-01-04 21:00:27

0

如果我理解正确,那么这可能适合你?

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 
+0

这是问题,我试图解决:t1.id在第二个LEFT OUTER JOIN中是未知的。 – recalcitrant 2012-01-04 18:29:45

+0

OOPS,对不起,没有注意到逗号...也许,然后选择*从A LEFT OUTER JOIN牛逼T1 ON t1.A_ID = A.id LEFT OUTER JOIN B开(t1.B_ID = B.id AND A.B_ID = B.ID) 将有助于 – 2012-01-04 18:38:49

+0

但尽管如此, ** A **和** B **之间有什么关系? – 2012-01-04 18:49:12