質問: ユーザーと商品のテーブル(省略)、 商品ジャンルテーブル、 genre id name 1 家電 2 3万円台 3 テレビ 4 黒 5 SONY 6 三菱 商品とジャンルのリレーションテーブル、 item_genre item_id genre_id 1 1 1 2 1 3 2 1 2 3 2 4 2 6 ユーザーが希望する商品ジャンルのテーブル(ユーザーとジャンルのリレーションテーブル)、 user_genre user_id genre_id 1 1 1 3 2 1 2 3 2 4 3 1 3 3 3 4 3 5 以上があるとします。 この時に商品側から(商品IDを元に)、その商品を希望しているユーザーIDを取得する場合の SQL文の作成方法のご教示をお願いいたします。 上記のテーブルの例ですと、アイテム1から取得したいユーザーIDは1、アイテム2からは ユーザーID 1と2を取得できればOKです。 商品が持つジャンルIDが1,2,3に対してユーザーが希望するジャンルIDが1,3のように少ない 場合は対象にふくまれますが、商品が持つジャンルIDが1,3に対してユーザーが希望する ジャンルIDが1,3,4のように多くなる場合は対象に含めません。 色々と考えてみたのですが、頭がこんがらがってしまい迷宮に迷い込んでしまいました。 すみませんがお知恵をお貸しください。よろしくお願いします。 ※DBサーバーがMySQLのため、MySQLで実現できる方法だとありがたいです。
回答: #2です ちなみにこんな感じ? //元データ create table item_genre(item_id int, genre_id int); insert into item_genre values(1,1),(1,2),(1,3),(2,1),(2,3),(2,4),(2,6); create table user_genre(user_id int,genre_id int); insert into user_genre values(1,1),(1,3),(2,1),(2,3),(2,4),(3,1),(3,3),(3,4),(3,5),(4,1),(4,4),(5,5); //結果 select user_id,item_id from user_genre as ug inner join item_genre as ig on ug.genre_id=ig.genre_id group by user_id,item_id having (user_id,count(*)) in (select user_id,count(*) from user_genre group by user_id); user4(user_id=4)は希望ジャンルが2個、item1(item_id=1)はジャンルが3個なので ジャンル数だけで考えればuser4はitem1に含まれますが、item1はgenre_id=4を 含まないので対象外、item2はジャンル1も4も持つため対象 user5(user_id=4)はgenre_id=5しか持たず、itemリストにgenre_id=5を持つ要素がないため 対象外