我有以下查询:
SELECT p.id,
p.firstname,
**p.address1id,
p.address2id,**
r.invoice_id,
i.authcode
FROM membershiprenewals r,
Profile p,
Invoice i
WHERE r.orgID = 1
and r.period_id = 3
and r.status = 0
and r.profile_id = p.id
and r.invoice_id = i.id;
此表格选择用户个人资料和一些相关详细信息。
配置文件地址存储在另一个表(profileaddress)中。一个配置文件可以有2个地址。使用p.address1和p.address2引用这些地址。
我需要扩展此查询以加入profileaddress表以获取BOTH地址并合并到单个记录中。
所以我需要的结果是以下列
p.id | p.firstname | .. etc .. | profileaddress1.address | profileaddress1.town | profileaddress2.address | profileaddress2.town | .. etc
我已经玩了几个小时的JOIN语句,但似乎无法破解它。
任何帮助都非常赞赏!!
杰森
答案 0 :(得分:2)
首先,从不在FROM
子句中使用逗号。 始终使用正确的,明确的JOIN
语法。所以,你的查询应该是:
SELECT p.id, p.firstname, **p.address1id, p.address2id,**
r.invoice_id, i.authcode
FROM membershiprenewals r JOIN
Profile p
ON r.profile_id = p.id JOIN
Invoice i
ON r.invoice_id = i.id
WHERE r.orgID = 1 AND r.period_id = 3 AND r.status = 0;
然后你想要两个连接到地址表:
SELECT p.id, p.firstname, p.address1id, p.address2id,
pa1.address, pa1.town,
pa2.address, pa2.town,
r.invoice_id, i.authcode
FROM membershiprenewals r JOIN
Profile p
ON r.profile_id = p.id JOIN
Invoice i
ON r.invoice_id = i.id LEFT JOIN
profileaddress pa1
ON p.address1id = pa1.id LEFT JOIN
profileaddress pa2
ON p.address2id = pa2.id
WHERE r.orgID = 1 AND r.period_id = 3 AND r.status = 0;
如果缺少其中一个地址,则使用LEFT JOIN
。