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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2045閲覧

【mysql】以下のSQL文が読み解けない

kobahito

総合スコア87

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/07/22 04:54

編集2016/07/22 05:48

※修正済(2016/07/22 17:48)

SELECT tb1.column1, MAX(tmp.column2) AS max_column2 FROM tb1_name tb1 JOIN ( SELECT (COALESCE(column3, column4)) AS column2, column1 FROM tb1_name ) tmp ON tmp.column1 = tb1.column1 GROUP BY tb1.column5

()の中身は一時テーブル?というものですか?
table_nameと一時テーブルをJOINしていると捉えて良いのでしょうか?
一時テーブルとはこのように作れるものなのですか?

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

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

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

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

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

yambejp

2016/07/22 06:03

SELECT句に出現しないcolumn5でGROUP BYするのは適切ではありません。 GROUP BY column1ということでしょうか?
kobahito

2016/07/22 06:23

>GROUP BY column1ということでしょうか? いえ、テーブル:tb1_nameのカラムの一つとしてあるものです。 ここで初めて出現しました。
yambejp

2016/07/22 06:27

具体例をだして検証してみるとわかると思いますが、前述のとおりSELECT句に出現しないカラムを利用してGROUP BYすることはおすすめしません。おそらく訳の分からないデータしか抽出できません
guest

回答3

0

ベストアンサー

まぁ普通に考えればそんな非効率な書き方はしませんね

SQL

1SELECT t1.column1 FROM table_name as t1 2JOIN table_name as t2 3ON t1.column1 = t2.column1;

追記:サンプルデータ

CREATE TABLE table_name(column1 int,index(column1)); INSERT INTO table_name VALUES(1),(1),(2),(3),(3);

追記:新サンプル

とりあえずcolumn5はcolumn1に読み替えて回答します

SQL

1CREATE TABLE table_name(column1 int,column3 int null,column4 int null); 2INSERT INTO table_name VALUES(1,null,100),(1,200,null),(1,null,null),(2,100,300);

上記に対して

SQL

1SELECT t1.column1,MAX(t2.column2) AS max_column2 2FROM table_name AS t1 3JOIN (SELECT COALESCE(column3, column4) AS column2,column1 FROM table_name) AS t2 4ON t1.column1 = t2.column1 5GROUP BY column1;

を実行するなら、以下で十分です

SQL

1SELECT column1,MAX(COALESCE(column3, column4)) AS max_column2 2FROM table_name 3GROUP BY column1

サブクエリで自分自身を結合するのでよく使うのは
特定のカラムの最大値を持つデータを表示するなど
サブクエリの中で集計が発生する場合です。

なお今回のCOALESCEの使い方ではcolumn3とcolumn4のどちらかにある最大値をとる
という仕様にはなっていません。なのでcolumn2_maxがもし上記条件を希望する場合は
正確にデータを取ることができません。
column3が合致した時点でcolumn4を検証しないのでcolumn3<column4の場合データが拾えない
もしどちらか最大値をとりたいならこんな感じ

SELECT column1,MAX(GREATEST(COALESCE(column3,0),COALESCE(column4,0))) AS max_column2 FROM table_name GROUP BY column1;

投稿2016/07/22 05:38

編集2016/07/22 06:24
yambejp

総合スコア114837

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

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

kobahito

2016/07/22 05:52

すいません。 先ほど載せたSQL文だと、元のSQLから削りすぎて、メリットがなくなってそうだったので、 元のSQLになるべく近い形で挙げ直しましたので、 このSQLの処理内容、メリットを今一度お教えいただけないでしょうか。。 段取りが悪くなってしまい申し訳ありませんが、よろしくお願いします。
yambejp

2016/07/22 06:28

新サンプル追記しておきました
kobahito

2016/07/22 08:25

なるほど。。。 とても詳しい回答をありがとうございます。 結果として下から2番目のSQLと同じになるんですね。 何をしているか感覚的にわかった気がします。 ありがとうございました!
guest

0

おそらく、どちらのテーブルも'table_name'で同じなので混乱されているのではないでしょうか。

SQLはテーブルに別名をつけることができます。
このSQLだと'tmp'がそれになります。
同じテーブルに別名をつけることで、あたかも2つテーブルがあるようにみなすことが出来ます。

ちなみにこのSQLの結果は、

SQL

1SELECT 2 table.column1 3FROM 4 table_name table

の結果と同じになると思います。

投稿2016/07/22 05:32

kaputaros

総合スコア1844

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

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

yambejp

2016/07/22 05:39

column1がユニークなカラムだとは限らないので提示の方法では 解を導けません
kobahito

2016/07/22 05:40

回答ありがとうございます。 そういう事なんですね。 その書き方と同じになるとしたら、質問文の様に書くメリットか意味かはあるのでしょうか? 質問は解決しましたが、お教えいただけるとありがたいです。
yambejp

2016/07/22 05:43

>質問文の様に書くメリットか意味かはあるのでしょうか? メリットは一切無いですね。 使い方がよくわからないままどうしてもサブクエリが使いたかったんじゃないですか?
kobahito

2016/07/22 05:52

すいません。 先ほど載せたSQL文だと、元のSQLから削りすぎて、メリットがなくなってそうだったので、 元のSQLになるべく近い形で挙げ直しましたので、 このSQLの処理内容、メリットを今一度お教えいただけないでしょうか。。 段取りが悪くなってしまい申し訳ありませんが、よろしくお願いします。
guest

0

MySQLの一時テーブルは「CREATE TEMPORARY TABLE~」とで作成するので、これはサブクエリだと
思います。

SQLとしては、table_nameとのJOINをしています。

投稿2016/07/22 05:11

編集2016/07/22 05:12
tomo.ina

総合スコア357

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

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

kobahito

2016/07/22 05:17

table_nameとサブクエリをJOINしているという事でしょうか? このSQLは、FROM以下を下の様に書くのと同じになるのでしょうか? FROM column1 in ( SELECT column1 FROM table_name )
tomo.ina

2016/07/22 05:27

同じになるのは以下のように書いたときだと 思います。 SELECT table.column1 FROM table_name table WHERE table.column1 IN (SELECT column1 FROM table_name )
kobahito

2016/07/22 05:38

すいまんせん。コメントに書いたSQLが変な感じになってました。 やはりそうですよね。ありがとうございます。 しかしそうなると質問文の様に書くメリットはあるのでしょうか? 質問は解決していますが、できればお教えいただければと思います。
yambejp

2016/07/22 05:50

column1がユニークでないケースを想定してください
kobahito

2016/07/22 05:52

すいません。 先ほど載せたSQL文だと、元のSQLから削りすぎて、メリットがなくなってそうだったので、 元のSQLになるべく近い形で挙げ直しましたので、 このSQLの処理内容、メリットを今一度お教えいただけないでしょうか。。 段取りが悪くなってしまい申し訳ありませんが、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問