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

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

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

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

Q&A

解決済

1回答

9806閲覧

結合したテーブルから更にサブクエリで抽出したい

m_s

総合スコア51

MySQL

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

0グッド

0クリップ

投稿2017/07/30 17:45

#実現したいこと
まず、tableA(user_idとplayer_idを主に列として持つ)とtableB(player_id,C を列として持つ)の2つのテーブルがあって、この2つを結合したテーブルから、更にサブクエリで抽出した結果を用いてWHEREでuser_id,player_id,C列を抽出したい。

#問題点
上を実現する為に以下のSQL文で実行してみたところ、WHEREの条件文が適用されていないため抽出ができていませんでした。(テーブルの結合は出来ており、エラーもありませんでした)

SQL

1SELECT p.user_id,p.player_id,C from tableA as p INNER JOIN tableB as u ON p.player_id = u.player_id WHERE p.player_id IN(select max(p.player_id) from `tableA` GROUP by user_id )

しかし、試しにWHEREの条件文をサブクエリを使わずに例えば
「WHERE p.player_id =5」とすると上手くそこだけ抽出できていました。
その為、サブクエリ(IN句の所)がおかしいことはわかったのですが、解決方法が分からない為、よろしくお願いします

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

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

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

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

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

SVC34

2017/07/30 21:44

データの例、意図する結果、現状得られている結果を記載してください
ahodana

2017/07/30 23:48

他のユーザーの情報がでてしまうなら。それはユーザーで絞ってないからだけど
guest

回答1

0

ベストアンサー

こんにちは

SQL

1SELECT p.user_id, p.player_id 2from tableA as p INNER JOIN tableB as u 3 ON p.player_id = u.player_id 4WHERE p.player_id IN ( 5 select max(p.player_id) from tableA GROUP by user_id 6 )

IN句でのmaxの指定が相関(p.がついている)になっていますよ。

SQL

1SELECT p.user_id, p.player_id 2from tableA as p INNER JOIN tableB as u 3 ON p.player_id = u.player_id 4WHERE p.player_id IN ( 5 select max(player_id) from tableA GROUP by user_id 6 )

としてみてください。

---追記
やりたいことが結合のリストを、max(player_id)だけのものにしたいということなら、
相関の記述の仕方が違います。

SQL

1SELECT p.user_id, p.player_id 2from tableA as p INNER JOIN tableB as u 3 ON p.player_id = u.player_id 4WHERE p.player_id = ( 5 select max(player_id) from tableA where user_id=p.user_id 6 )

※max()なのでin句である必要がないので=に変更

投稿2017/07/31 00:54

編集2017/07/31 01:27
sazi

総合スコア25138

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

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

m_s

2017/07/31 02:52

追記でない方のSQLで実行してみたらいけました!ありがとうございますm(__)m ただ、疑問なのですが、相関(p.がついている)だとなぜ抽出できない(Whereの条件文が適用されない)のか理由が考えたのですが分からなかったのでどなたか教えていただけると嬉しいです
sazi

2017/07/31 03:20

SQLは基本的にデータを1行ずつ処理しているものと考えてください。 そうすると処理している1行の値を参照してmax()を取ってみても、結果は、 p.player_id=p.player_id となり、条件としては意味のないものになっているからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問