加入具有多个FK和行的表

时间:2016-11-25 04:18:39

标签: mysql sql

我有以下查询:

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语句,但似乎无法破解它。

任何帮助都非常赞赏!!

杰森

1 个答案:

答案 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