2011-10-23 74 views
0

我有一些表使用連接表具有'屬於許多'類型的關係。主表是國家,方案和清單。其基本結構是:三個表的MySQL連接

countries 
    -id 
    -name 

programs 
    -id 
    -name 

listings 
    -id 
    -title 

countries_programs 
    -country_id 
    -program_id 

listings_programs 
    -listing_id 
    -program_id 

listings_countries 
    -listing_id 
    -country_id 

我一直在做給定值的國家ID(在這種情況下5)當以下列出一個國家的方案:

SELECT programs.* 
FROM programs 
LEFT JOIN countries_programs ON programs_id = countries_programs.program_id 
LEFT JOIN countries ON countries.id = countries_programs.country_id 
WHERE countries_id = '5' 

我需要做什麼只有當特定國家的計劃實際上也有該國的任何清單時,纔是該國的計劃。因此,它只能返回程序在指定國家和在該程序中以及該國家的列表中的情況。

如果指定國家的程序沒有列表,那麼我不希望它返回。我一直在嘗試各種組合,但似乎無法得到這個工作。有沒有人看到如何做到這一點?

我想我需要加入物品清單表,但我沒有試過任何東西。

+0

使用內部連接,而不是外部連接。 –

回答

1

爲了避免返回重複的數據,我會使用EXISTS子句。此外,切換到INNER加入,以滿足國家的要求。

SELECT p.* 
FROM programs p 
INNER JOIN countries_programs cp 
    ON p.id = cp.program_id 
WHERE cp.country_id = 5 
AND EXISTS (
    SELECT 1 FROM listings_countries lc 
    INNER JOIN listings_programs lp 
     ON lc.listing_id = lp.listing_id 
    WHERE lc.country_id = c.id 
    AND lp.program_id = p.id 
) 

我省略了加盟countries因爲你只處理這是countries_programs可用的國家ID。

+0

非常感謝菲爾。我還沒有得到我需要的結果,但你已經給了我一個嘗試解決問題的基礎。對此,我真的非常感激。 – Frank

+0

@Frank你得到的結果出了什麼問題? – Phil

+1

我得到它的工作,我只需要做一個小小的改變。從你的答案部分:WHERE cp.id = 5需要cp.country_id。我認爲這就是我需要的全部工作。再次感謝,我非常感謝你的幫助。 – Frank