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

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回答

4135閲覧

MYSQLで2つのテーブルから新しいビューを作成したい

yushu

総合スコア1

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/11/17 07:53

編集2020/11/17 11:45

MYSQLで2つのテーブルから新しいビューを作成したい。

下記のような2つのテーブル(table_a, table_b)から、新しいビュー(new_view)を作成したいのでが、思うような結果を得られません。

[table a]

Date_a(pk)Value_a
202006021638
202006031630
202006041652
202006051619
202006081625
202006091619
202006101613

[table b]

Date_b(pk)Value_b
202006011000
202006071200
202006081500
202006111600

[new_view]

Date_a(pk)Value_aDate_bValue_b
202006021638202006011000
202006031630202006011000
202006041652202006011000
202006051619202006011000
202006081625202006071200
202006091619202006081500
202006101613202006081500

[ルール]

  • table_aをもとにtable_bをくっつける(JOINする)
  • Date_aからみて過去日付且つ最も直近のDate_bとValue_bをくっつける(MAX(Date_b) WHERE Data_a>Date_b)

試したこと

下記のようなSQLを試してみましたが、思うような結果が得られません。

SELECT Date_a,Value_a,Date_b,Value_b FROM table_a
JOIN table_b
ON (table_a.Date_a = (SELECT MAX(table_b.Date_b) from table_a where table_a.Date_a > table_b.Date_b))

バージョンは下記です。
MariaDB > select version();
+-----------------+
| version() |
+-----------------+
| 10.2.10-MariaDB |
+-----------------+

(追記)
質問の内容が不明瞭でしたが、最終的にやりたいことは[new_view]のようなビューを作ることです。
そのもとになるSELECT文が分からない、という意味となります。

質問で例示したテーブルのCREATE文、INSERT文を記します。

CREATE TABLE table_a (
Date_a INTEGER,
Value_a INTEGER,
PRIMARY KEY(Date_a)
);

CREATE TABLE table_b (
Date_b INTEGER,
Value_b INTEGER,
PRIMARY KEY(Date_b)
);

INSERT INTO table_a VALUES
(20200602,1638),
(20200603,1630),
(20200604,1652),
(20200605,1619),
(20200608,1625),
(20200609,1619),
(20200610,1613);

INSERT INTO table_b VALUES
(20200601,1000),
(20200607,1200),
(20200608,1500),
(20200611,1600);

SQL使ってまだ経験が浅いため、お力いただけるとありがたいです。
よろしくお願いいたします。

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

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

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

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

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

yambejp

2020/11/17 09:05 編集

連結したSQL文がかけないのか?ビューが作れないのか? どちらの質問でしょうか? テーブルA,Bはcreate table+insertで例示してください
yushu

2020/11/17 11:45

質問内容に追記しました。 内容が不明瞭で申し訳ありませんでした。
guest

回答1

0

ベストアンサー

table_aとtable_b を1:1で結合するためには、直接の結合が出来ない為、橋渡しする情報を作成する必要があります。

SQL

1SELECT Date_a,Value_a,Date_b,Value_b 2FROM table_a inner join ( 3 select table_a.Date_a, MAX(table_b.Date_b) max_Date_b 4 FROM table_a left join table_b 5 ON table_a.Date_a >= table_b.Date_b 6 group by table_a.Date_a 7 ) map 8 on table_a.Date_a=map.Date_a 9 left join table_b 10 on map.max_Date_b=table_b.Date_b

若しくは、1:多で結合し、条件によって絞り込む

SQL

1select Date_a,Value_a,Date_b,Value_b 2FROM table_a left JOIN table_b 3 ON table_a.Date_a >= table_b.Date_b 4where table_b.Date_b = ( 5 select max(Date_b) from table_b 6 where Date_b <= table_a.Date_a 7 ) 8 or table_b.Date_b is null

投稿2020/11/17 09:08

編集2020/11/17 09:20
sazi

総合スコア25327

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

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

yushu

2020/11/17 11:47

ありがとうございました。 どちらの内容でも作ることができました。 大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問