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

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

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

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

SQL

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

Q&A

1回答

1538閲覧

sqlでwhereにおいて異なるテーブルの列同士を比較した場合の挙動がわからない

abea

総合スコア32

MySQL

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

SQL

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

0グッド

0クリップ

投稿2021/08/31 10:34

編集2021/08/31 11:31

下のサイトにあるように、異なるテーブルの列同士をwhereで比較した場合(6行目 c1.timestamp > c.timestamp)、内部的にはどのような処理が行われるのでしょうか?
stackoverflow.com/questions/4070476/sql-query-to-join-two-tables-based-off-closest-timestamp
sqlの内容としては、Classificationの行でtimestampがテーブルClosed Casesのtimestamp以前のものをマージするという内容になっています。

table

1Closed Cases 2| id | resolution | timestamp | 3------------------------------------------------ 4| 1 | solved | 2006-10-05 11:55:44.888153 | 5| 2 | closed | 2007-10-07 12:34:17.033498 | 6| 3 | trashed | 2008-10-09 08:19:36.983747 | 7| 4 | solved | 2010-10-13 04:28:14.348753 | 8 9Classification 10| id | value | timestamp | 11------------------------------------------------- 12| 1 | freshman | 2006-01-01 12:02:44.888153 | 13| 2 | sophomore | 2007-01-01 12:01:19.984333 | 14| 3 | junior | 2008-01-01 12:02:28.746149 | 15 16desired result 17| id | resolution | timestamp | value | 18-------------------------------------------------------------- 19| 1 | solved | 2006-10-05 11:55:44.888153 | freshman | 20| 2 | closed | 2007-10-07 12:34:17.033498 | sophomore | 21| 3 | trashed | 2008-10-09 08:19:36.983747 | junior | 22| 4 | solved | 2010-10-13 04:28:14.348753 | junior |

sql

1SELECT case.id, case.resolution, case.timestamp, class.value 2 FROM closed_cases AS case 3 LEFT JOIN (select c.*, 4 (select min(timestamp) 5 from classifications c1 6 where c1.timestamp > c.timestamp) timeend 7 from classifications c) AS class 8 ON case.timestamp >= class.timestamp and 9 (case.timestamp < class.timeend or class.timeend IS NULL) 10 WHERE case.timestamp BETWEEN $1 AND $2;

目的から推測するとc1.timestampの各値について、cのtimestampがc1.timestampの一つの値より小さいcの行をまとめて取ってきて、その行たちについてmin(timestamp)を計算しているように思えます。
同じテーブルの2つの列を比較する場合は単純にwhereの条件を満たす行を取ってくるだけだと思うのですが、このように異なるテーブル間の列同士の比較は内部的にどのような処理が行われるのか教えていただけると助かります。

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

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

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

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

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

Orlofsky

2021/08/31 11:12

SQLで使っているテーブルのCREATE TABLE文も同じくMarkdownのコードで追記してください。
guest

回答1

0

Closed_Casesに対してClassificationのtimestampの中で自分より小さな
最大のtimestampをもつvalueを得ているのでしょうか?
であればClosed_CasesとClassificationをつなぐ中間テーブルを
仮想的に作れば良いような気がします

SQL

1select t3.*,t5.value from Closed_Cases as t3 2inner join 3(select t1.id ,max(t2.dt) as dt from Closed_Cases as t1,Classification as t2 4where t1.dt>t2.dt 5group by id) as t4 on t3.id=t4.id 6inner join Classification as t5 on t4.dt=t5.dt

投稿2021/09/01 01:14

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問