2011-10-23 17 views
0

私は、結合テーブルを使用して '持っていて、多くの種類の型の関係になっているテーブルがあります。メインテーブルは国、プログラム、リストです。基本的な構造は次のとおりです。3つのテーブルの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 

は、私は(この場合は5)国のid値が与えられたときに国のためのプログラムを一覧表示するには、次のやっている:私がする必要がどのような

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_programsで利用可能で、国のIDを扱っているようcountriesに参加省略しました。

+0

ありがとうPhil。私はまだ必要な結​​果を得ていないが、あなたは私にそれをうまくさせるための基礎を与えている。ほんとうにありがとう。 – Frank

+0

@Frankあなたが得た結果に何が間違っていましたか? – Phil

+1

私はそれが働いて、ちょうど小さな変更を加える必要があった。あなたの答えから、cp.id = 5がcp.country_idである必要があった場所。私は、それを機能させるために必要なのは私だけだと思います。おかげさまで、本当にありがとうございます。 – Frank

関連する問題