2016-04-22 19 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)時可以毫不含糊。

相關問題