指定された趣味を持つメンバーがいるグループを抽出するSQL
グループテーブル、メンバーテーブル、趣味テーブルの3つのテーブルがあります。
あるメンバーはあるグループに属しており、趣味を1つ持っています。
以下がそのSQLです。
CREATE TABLE groups ( g_id int primary key );
CREATE TABLE members ( m_id int primary key , g_id int , h_id int );
CREATE TABLE hobbies ( h_id int primary key, h_name text );
INSERT INTO groups VALUES ( 1 );
INSERT INTO groups VALUES ( 2 );
INSERT INTO groups VALUES ( 3 );
INSERT INTO members VALUES ( 1, 1, 1);
INSERT INTO members VALUES ( 2, 1, 3);
INSERT INTO members VALUES ( 3, 1, 4);
INSERT INTO members VALUES ( 4, 1, 4);
INSERT INTO members VALUES ( 5, 2, 1);
INSERT INTO members VALUES ( 6, 2, 2);
INSERT INTO members VALUES ( 7, 2, 3);
INSERT INTO members VALUES ( 8, 3, 2);
INSERT INTO members VALUES ( 9, 3, 3);
INSERT INTO members VALUES ( 10, 3, 4);
INSERT INTO hobbies VALUES ( 1, 'sports' );
INSERT INTO hobbies VALUES ( 2, 'music' );
INSERT INTO hobbies VALUES ( 3, 'book' );
INSERT INTO hobbies VALUES ( 4, 'drive' );
指定された趣味を持つメンバーがいるグループを抽出するにはどうすればいいでしょうか?
例えば、「読書が趣味なメンバーとドライブが趣味なメンバーがいるグループは?」「グループ1とグループ3」のような感じです。
一応自分で考えてみたのが、以下ですが、これだと趣味の指定が増減すると大きくSQLが変わってしまいます。
もっといいやり方はないでしょうか?
私はPostgreSQL8を使ってますが、汎用的なSQLであれば、そっちの方がいいです。
SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'drive'
INTERSECT SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'book';
お礼
ありがとうございました。