※casts,genre,storeのカラム「id」はmoviesテーブルのカラム「id」の外部キーであるものとします。
movies
|*id|*title|
|1|スターウォーズ|
|2|ハリーポッター|
|3|ウルヴァリン|
|4|インセプション|
|5|第9地区|
casts
|*id|*title|
|1|taro|
|1|miki|
|1|takumi|
|2|jun|
|2|ai|
|3|hizuka|
|4|ami|
|5|eisuke|
genre
|*id|*genre|
|1|ドキドキする|
|1|感動する|
|2|童心に帰れる|
|3|ドキドキする|
|4|不思議な世界|
|5|グロ注意|
store
|*id|*genre|
|1|*tsutaya|
|1|*dorama|
|2|*tsutaya|
|3|*tsutaya|
|3|*dorama|
|4id|*tsutaya|
|5id|*tsutaya|
これらのテーブルから以下の条件に一致するレコードを抽出するには
どのようなSQLが最適でしょうか
※SQL以外の手段を用いる場合は、その方法を具体的に示していただけると助かります。
条件
・castsにtaroとhizukaが含まれる
・genreに不思議な世界とグロ注意が含まれる
・storeにtsutayaとdoramaが含まれる
環境 postgresql 8.3.7
movies 以外は id に対する項目が複数あるようですから、テーブル結合よりサブクエリの方が良いでしょうか。
すべてが And 条件ですので、サブクエリを重ね合わせればよいかと思います。
テーブルとフィールド名が少し混乱しているようですが、例に合わせれば、
SELECT * FROM movies WHERE id IN ( SELECT id FROM casts WHERE ( title IN ( 'taro', 'hizuka' ) ) AND ( id IN ( SELECT id FROM genre WHERE ( genre IN ( '不思議な世界', 'グロ注意' ) ) AND ( id IN ( SELECT id FROM store WHERE genre IN ( 'tsutaya', 'dorama' ) ) ) ) ) )
のような形だと思います。
参考になります。
条件が増えれば増えるほど、SQLも長くなってしまうのはやはりしょうがないことなんでしょうか。
あとは、SQL発行時のパフォーマンスが気になります。
ここらへんは実データを登録したテーブルでexplain analyzeして確認するしかないですね。