1

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

期望的输出: 当我批量打印所有合同时(比如说,每周五),我还需要为每个成员打印一份合同副本,但要在合同中包含成员的详细信息,而不是主要成员。

问题: 这如何转化为 mysql 查询?好的,它是左连接,但我怎么说“从表中打印数据members而不是contracts连接行”?

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

示例表和数据:

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 结束,但我希望所有名称都属于 name 并且所有其他匹配的列也是如此。

4

2 回答 2

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))
于 2012-06-20T18:21:53.743 回答
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 作为虚拟字段来填充空白。

于 2012-06-25T16:57:04.897 回答