几天来我一直在努力改变我的查询,但我就是无法得到我想要的结果。 我有点希望有人能帮助我改变我的查询。
现在有以下查询:
SELECT
t.tId,
t.tName,
a.aId,
a.aName,
u.uId,
u.uName
FROM
tableT t
LEFT JOIN t_a ta USING (tId)
LEFT JOIN t_u tu USING (tId)
LEFT JOIN tableA a ON a.aId = ta.aId
LEFT JOIN tableU u ON u.uId = tu.uId
它返回 tableT 中与 tableA 和 tableU 中匹配的行。 现在我必须更改它以获得同时返回 tableA 中所有行的结果。
如果我没记错的话,我想要与 tableA 进行 FULL OUTER JOIN,并与 tableU 进行 LEFT JOIN。 (我知道 FULL OUTER JOIN 不存在,这让我更加困惑)
表 t_a 包含多对多关系,表 t_u 包含来自 tableT 的多对一关系。
简而言之,当我搜索一个值时,我希望返回以下行: 任何包含该值的 tableT 行以及 tableU 中的匹配行和 tableA 中的匹配行。 任何其他(不匹配的)表包含该值的行。 tableU 中没有其他(不匹配的)行。
之前需要的值:
tableT tableA tableU
ANY ANY ANY
ANY NULL ANY
ANY NULL NULL
现在需要的值:
tableT tableA tableU
ANY ANY ANY
ANY NULL ANY
ANY NULL NULL
**NULL** **ANY** **NULL**
当我在错误的情况下寻求帮助时,我深表歉意。 预先感谢您的帮助。
这里有一个 fiddle :http://sqlfiddle.com/#!2/f6301/11
它返回除包含以下内容的行之外的所有所需行:
TID TNAME AID ANAME UID UNAME
NULL NULL 4 aName4 NULL NULL
最佳答案
table t_a contains many to many relations and table t_u contains many to one relations from tableT's respective.
但是t_a和t_u之间没有关系。然而,您正试图让它们彼此共享元组空间。
像这样看。 TableT 是一个父类(super class)。表 t_a 扩展了 TableT 以形成自己的类。表 t_u 还扩展了 TableT 以形成自己的类。因此,虽然 t_a 和 t_u 都扩展了 TableT,但它们形成了真正彼此独立的单独类(实体)。确实没有办法将它们硬塞到一个实体表达式(元组)中。
换句话说,您正在尝试混合苹果和橙子,而关系数据库不能很好地处理水果沙拉。
关于mysql 合并多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23870131/