質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

474閲覧

SQLで欲しい情報を取得するためのクエリが分からない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2021/04/22 10:33

編集2021/04/22 10:49

テーブル構造としてはシンプルな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なので重複しないようにしたい

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/04/22 10:36

まず自身が思ったように組んでみてください。 あと、テーブル定義をCREATE TABLE文で提示してください。
guest

回答2

0

ベストアンサー

for_spさんのやりたいこととしては、
user.idが2であるユーザーに送信されていないpostを見つけたいになるんですかね。
それだと上のneko_the_shadowさんのクエリでも取得できると思いますし、下記のクエリでも実現できると思います。

SQL

1SELECT * 2FROM posts 3WHERE id NOT IN ( 4 SELECT post_id 5 FROM user_post 6 WHERE user_id = 2 7 )

サブクエリが評価された後は次のようなクエリになります。

SQL

1SELECT * 2FROM posts 3WHERE id NOT IN (2,3) 4

ここまでくるとわかりやすいですかね。
最終的にpostテーブルのidが2,3以外のもの、ここだとid=1のレコードが取得できることになります。

投稿2021/04/22 15:41

ma-kun92

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/23 01:14

なるほど!INを使うのですね、、!勉強になります!ありがとうございます!
guest

0

やりたいことは以下であっていますか?

  • 欲しいのはpostsテーブルのデータ
  • user_postsを見て、user_id=2がかかわっているデータは不要

であれば、以下のようなクエリになると思います。

sql

1SELECT * 2FROM posts p 3WHERE NOT EXISTS ( 4 SELECT * 5 FROM user_posts up 6 WHERE p.id = up.post_id 7 AND up.user_id = 2 8)

投稿2021/04/22 13:00

neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/23 01:14

あっています!EXISTSを使う方法があるのですね、、!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問