mysql结合了多个连接

时间:2014-05-26 12:24:55

标签: mysql sql join

我几天来一直在努力改变我的查询,而我却无法得到我想要的结果。 我希望有人能帮助我改变我的查询。

现在有以下查询:

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的完全外连接和一个与tableU的LEFT JOIN。 (我知道FULL OUTER JOIN不存在,这让我更加困惑)

表t_a包含多对多关系,表t_u包含来自tableT各自的多对一关系。

简而言之,当我搜索一个值时,我希望返回以下行: 包含值的任何tableT行匹配来自tableA的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**

我在错误的情况下寻求帮助时道歉。 提前感谢您的帮助。

这里有一个小提琴:http://sqlfiddle.com/#!2/f6301/11

它返回除包含:

的行之外的所有所需行
TID    TNAME    AID    ANAME    UID    UNAME
NULL   NULL     4      aName4   NULL   NULL

3 个答案:

答案 0 :(得分:0)

我认为你想要的是从tidtableT的所有t_a开始:

FROM ((SELECT t.tID from tableT) UNION
      (SELECT ta.tID from tableA t_a)
     ) ids left outer join
     tableT t
     USING (tId) LEFT JOIN
     t_i ti
     USING (tId) LEFT JOIN
     tableA a
     ON a.aId = ta.aId LEFT JOIN
     tableU u
     ON u.uId = ti.uId

答案 1 :(得分:0)

  

表t_a包含多对多关系,表t_u包含多个   来自tableT各自的一个关系。

但是t_a和t_u之间没有任何关系。然而,你正试图让他们彼此分享元组空间。

这样看。 TableT是一个超类。表t_a扩展TableT以形成它自己的类。表t_u还扩展了TableT以形成它自己的类。因此,虽然t_a和t_u都扩展了TableT,但它们形成了彼此独立的独立类(实体)。实际上没有办法将它们变成一个实体表达式(元组)。

换句话说,你试图混合苹果和橙子,关系数据库不能很好地做水果沙拉。

答案 2 :(得分:0)

如果我没有弄错我需要的查询如下:

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 ti USING (tId)
    LEFT JOIN tableA a USING (aId)
    LEFT JOIN tableU u USING (uId)
UNION
SELECT
    t.tId,
    t.tName,
    a.aId,
    a.aName,
    NULL,
    NULL
FROM
    tableT t
    RIGHT JOIN t_a ta USING (tId)
    RIGHT JOIN tableA a USING (aId)
    WHERE t.tId IS NULL

但我确定它可以优化或不同。

它现在/应该返回tableT中的所有行,包含可能的相关tableA数据和可能的相关tableU数据以及任何其他tableA行。