连接2个表,在连接行出现时从第2个表打印数据

时间:2012-06-20 18:04:52

标签: mysql join logic

案例: 我有2个表,'contract'和'members'与contract.id = members.cid绑定。 每份合同都有一名主要成员和几名次要成员(通常是主要成员的子女和配偶)。主成员的详细信息(名称,地址等)存储在表合同中,而额外成员的详细信息保存在表成员中。 (糟糕的逻辑,我知道,但这开始是一团糟,我需要时间重新设计数据库和网站)

所需的输出: 当我运行所有合同的批量打印(比方说,每个星期五)时,我还需要为每个成员打印合同的副本,但是合同的成员而不是主要成员。

问题: 这如何转换为mysql查询?好吧,它是一个左连接,但是我怎么说“从表members打印数据而不是contracts对于连接的行”? < / p>

2个表中出现的主要字段是name + surname,这些字段对于草稿查询示例应该足够了。

示例表和数据:

contracts
-------------------------
id  |  name  | surname | 
-------------------------
1   |  Tom   | Jones   |
2   |  Jamie | Oliver  |

members
--------------------------------
id  |  cid |  name  | surname | 
--------------------------------
1   |   1  |  Jack  | Jones   |
2   |   1  |  Anne  | Jones   |
3   |   2  |  Cathy | Wilson  |

所以我想要的结果是:

cid | name   | surname |
--------------------------
1   |  Tom   | Jones   |
1   |  Jack  | Jones   |
1   |  Anne  | Jones   |
2   |  Jamie | Oliver  |
2   |  Cathy | Wilson  |

如果我写

SELECT c.name as name, c.surname as surname, m.name as name, m.surname as surname
FROM contracts c
join members m on c.id = m.cid

我最终得到了 name和name_1,surname和surname_1但我希望所有名称都属于名称,同样适用于所有其他匹配列。

2 个答案:

答案 0 :(得分:0)

希望这可行:::

select c1.id, c1.name, c1.surname 
from contracts c1
union 
(Select m.id, m.name, m.surname 
  from 
members m left join contracts c on (c.id = m.cid))

答案 1 :(得分:0)

这是我最终做的并且它有效(字段名称不同但语法才重要):

SELECT u.id, u.onoma_u, u.name_u,
       coalesce(u.programa, aa.programa) as programa,
       coalesce(u.barcode, aa.barcode) as barcode,
       coalesce(u.plan, aa.plan) as plan,
       coalesce(u.im_exp, aa.im_exp) as im_exp,
       coalesce(u.symb, aa.symb) as symb
       FROM (SELECT a1.id, a1.onoma_u, a1.name_u, a1.programa, a1.barcode, a1.plan, a1.im_exp, a1.symb
       FROM aitisi a1 
        UNION
           SELECT a2.id, m.name, m.surname, NULL, NULL, NULL, NULL, NULL
           FROM members m
        JOIN aitisi a2 ON a2.id = m.symbid) u
       JOIN aitisi aa ON aa.id = u.id;

我使用别名和NULLS作为虚拟字段来填补空白。