2016-04-22 61 views
1

所以我有一种情况,其中表Partners与一个名为Regions的表具有一对一的关系,并且通过名为Destinations的相交表与同一个表具有一对多关系。下面我很好的命名约定可以帮助你弄清楚我的意思。如何在表格上连接两次并每次引用一个列名称不同?

 Regions 
====================== 
id | name 
====================== 
    1 | "United States" 
    2 | "Mother Russia" 
    3 | "Belize" 

      Partners 
================================= 
id | name  | region_id 
================================= 
    1 | "B Obama" |  1 
    2 | "V Putin" |  2 


     Destinations 
============================== 
    partner_id | region_id 
============================== 
     1  |  2 
     1  |  3 
     2  |  1 
     2  |  3 

我想是返回像

​​3210

结果的问题是,我无法弄清楚如何才能使这个查询的Regions表连接两次查询。我知道我要的是像

SELECT Partners.name AS partner_name, 
     Regions.name AS partner_region, 
     ???   AS destination_region 
    FROM 
     Partners INNER JOIN Regions ON Partners.region_id=Regions.id 
       INNER JOIN Destinations ON Partners.id=Destinations.partner_id 

但什么我在困惑是因为Regions已被合并到Partners如何填写以上???

回答

4

您需要另一个join

SELECT p.name AS partner_name, 
     rd.name AS partner_region, 
     rd.name AS destination_region 
FROM Partners p INNER JOIN 
    Regions rp 
    ON p.region_id = rp.id INNER JOIN 
    Destinations d 
    ON p.id = d.partner_id INNER JOIN 
    Regions rd 
    ON d.region_id = rd.id; 

注意,表的别名使查询更容易编写和阅读。

2

你必须JOINRegions两次:

SELECT 
    partner_name  = p.name, 
    partner_region  = r.name, 
    destination_region = dr.name 
FROM Partners p 
INNER JOIN Regions r 
    ON r.id = p.region_id 
INNER JOIN Destinations d 
    INNER JOIN Regions dr 
     ON dr.id = d.region_id 
    ON d.partner_id = p.id 

ONLINE DEMO

2

你需要从目的地再添加其他加盟地区:

SELECT Partners.name AS partner_name, 
     Regions.name AS partner_region, 
     Regions2.name AS destination_region 
    FROM 
     Partners INNER JOIN Regions ON Partners.region_id=Regions.id 
       INNER JOIN Destinations ON Partners.id=Destinations.partner_id 
       INNER JOIN Regions AS Regions2 on Destinations.region_id = Regions2.id 

注意,我将第二个别名添加到名为的Regions表0。您需要该别名,以便在向服务器告知您想要的列(例如,Regions2.name)时可以毫不含糊。

相关问题