QA@IT

SQL文作成について知恵をお貸しください

3665 PV

ユーザーと商品のテーブル(省略)、

商品ジャンルテーブル、

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で実現できる方法だとありがたいです。

回答

MySQL の環境が無いので、SQL Server で試していますがこんな感じでどうでしょうか?
多分 MySQL でも動くのでは。。

select 
  item_id, user_id
from 
  item_genre i inner join user_genre u 
    on i.genre_id = u.genre_id
group by 
  item_id, user_id
having 
  count(i.genre_id) >= ( 
    select count(*) from user_genre where user_genre.user_id = u.user_id
  )
`
編集 履歴 (0)
  • おー!バッチリです。
    目から鱗でした。ありがとうございました!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。