テーブル構造としてはシンプルなidだけを持ったUsersテーブルとPostsテーブルで、中間テーブルとしてUserPostsがあるとします。また、このようなデータが入っているとします
bash
1mysql> select * from user_posts; 2+----+---------+---------+---------------------+---------------------+ 3| id | user_id | post_id | created_at | updated_at | 4+----+---------+---------+---------------------+---------------------+ 5| 1 | 1 | 1 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 6| 2 | 1 | 2 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 7| 3 | 2 | 2 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 8| 4 | 1 | 3 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 9| 5 | 2 | 3 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 10| 6 | 3 | 3 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 11+----+---------+---------+------------+---------------------+---------------------+ 12 13mysql> select * from posts; 14+----+---------------------+---------------------+ 15| id | created_at | updated_at | 16+----+---------------------+---------------------+ 17| 1 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 18| 2 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 19| 3 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 20+----+---------------------+---------------------+ 21 22mysql> select * from users; 23+----+---------------------+---------------------+ 24| id | created_at | updated_at | 25+----+---------------------+---------------------+ 26| 1 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 27| 2 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 28| 3 | 2021-04-22 09:11:59 | 2021-04-22 09:11:59 | 29+----+---------------------+---------------------+
上記の条件のもと、user_posts.user_idが2のpostを除いたposts一覧を取得したい(上記の条件だとPostID=1のものだけが帰ってきて欲しい)のですがいい方法が思い付かず、もしわかる方がいらっしゃいましたら教えていただきたいです。
追記
当初 select * from posts inner join user_posts on posts.id = user_posts.post_id where not user_posts.user_id = 2;
というクエリで取得できると思っていたのですが、これだと以下のような問題点があり意図したものが取得できませんでした
- user_id=1, post_id=2の場合やuser_id=3, post_id=3の場合がすり抜けてしまう(postID=2, 3はuser_id=2が持ってるPostIDなので除外したい)
- user_id=1, post_id=3やuser_id=3, post_id=3のものは同じpost_idなので重複しないようにしたい
回答2件
あなたの回答
tips
プレビュー