案例: 我有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但我希望所有名称都属于名称,同样适用于所有其他匹配列。
答案 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作为虚拟字段来填补空白。