人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

以下のような4のテーブルがあるとします。
※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

●質問者: muggy0812
●カテゴリ:ウェブ制作
✍キーワード:AI AMI dorama JUN miki
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Mook
●60ポイント ベストアンサー

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して確認するしかないですね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ