SQL连接具有一对一和一对多关系的表

时间:2016-04-15 17:27:34

标签: mysql sql join relationship sql-like

标题可能是一个糟糕的标题,但我想不出更好的标题......

我有一种独特的模式,我有5个表关系,但其中一个表与两个表有关系。为了减少混乱,让我向您展示架构:

表A:

AID BID Name
1   1   101
2   1   102
3   1   103
4   2   104
5   3   105
6   4   106

其中AID是表A的主要ID,BID是表B的主要ID

表B:

BID   CID   DID   Name
1     null  3     101
2     null  4     102
3     1     null  103
4     2     null  104

其中CID为null或DID为null

表C:

CID   DID   Name
1     1     A
2     2     B
3     3     A
4     4     B
5     5     C
6     5     A

表D:

DID   EID   Name
1     1     Alpha
2     1     Bravo
3     1     Charlie
4     1     Echo
5     2     Delta

表E:

EID   Name
1     Home
2     Away

我知道这可能有点令人困惑,但基本上数据可以做以下两件事之一:

  1. 表A中的数据可以连接到B,然后是C,然后是D,然后是E或
  2. 表A中的数据可以连接到B,然后是D,然后是E
  3. 我的问题是我想创建一个SQL查询,它将加入所有表,从任何行中获取A.Name,A.AID和E.Name,其中B.Name LIKE'%某些名称%',C.Name LIKE'%有些名称%',D.Name LIKE'%有些名称%'和E.Name LIKE'%有人说%'。

    所以例如,我想要一个查询,如果我设置了E.Name LIKE'%Home%',查询将返回:

    E.Name    E.EID    D.DID    C.CID    B.BID    A.AID    A.Name
    
    Home      1        3        null     1        1        101
    Home      1        3        null     1        2        102
    Home      1        3        null     1        3        103
    Home      1        4        null     2        4        103
    Home      1        1        1        3        5        103
    Home      1        2        2        4        6        103
    

    目前我的当前查询仅返回"随机"数据,我的意思是它返回一些东西,但不是正确的东西,我无法弄清楚它返回的行有什么共同点,查询正在拉动。但基本上我的查询是:

    select ... from tableA, 
    inner join tableB on A.BID=B.BID 
    inner join tableC on B.CID=C.CID 
    inner join tableD on C.DID=D.DID OR B.DID=D.DID 
    inner join E.EID = D.EID
    WHERE E.Name LIKE '%Home%';
    

    任何建议都会很棒!谢谢!!!

2 个答案:

答案 0 :(得分:1)

{{1}}

答案 1 :(得分:1)

如果您将一些INNER JOIN更改为LEFT JOIN,您应该会得到所需的结果。

SELECT e.Name, e.EID, d.DID, c.CID, b.BID, a.AID, a.Name
FROM TableA a
INNER JOIN TableB b ON a.BID = b.BID
LEFT JOIN TableC c ON b.CID = c.CID
INNER JOIN TableD d ON c.DID = d.DID or b.DID = d.DID
INNER JOIN TableE e ON d.EID = e.EID
WHERE e.Name LIKE '%Home%'