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

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

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

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

Q&A

解決済

2回答

607閲覧

JOINされたテーブルと別テーブルとの比較方法が分からない

hop

総合スコア15

MySQL

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

0グッド

0クリップ

投稿2018/11/20 07:37

編集2018/11/20 08:12

ガチ初心者です。

前提条件

使用しているのはMySQL
テーブルA,Bのコピーが格納されているテーブルCopyA,CopyBがある。
テーブルA,Bは自動更新される。
テーブルCopyA,Bは手動更新をしないと更新が行われない。
なので、現在はテーブルA,BとテーブルCopyA,Bの中身には差異(テーブルA,Bの方が数値が大きい)がある。

やっていること

①テーブルCopyA,CopyBからカラム1毎のカラムXのMAXの値を取得
②テーブルA,BのカラムXと①を比較
③テーブルA,BからカラムXが①以下のものを取得
④③を元にテーブルA,Bからカラム1,2,3,4を取得

やりたいこと

②で手詰まりになったので、上記②の方法が知りたい。
(ようは別テーブルから取得した値をもとに比較をして、出てきた結果を出力したい。)

SQL

1CREATE TABLE テーブルA,テーブルCopyA 2(カラム1(varchar)(),カラム2(varchar),カラムX(datetime)) 3 4CREATE TABLE テーブルB,テーブルCopyB 5(カラム1(varchar)(),カラム3(varchar),カラム4(varchar),カラムX(datetime)) 6 7現在の成果 8SELECT 9 テーブルA.カラム1, 10 テーブルA.カラム2, 11 テーブルB.カラム3, 12 テーブルB.カラム4 13FROM( 14 SELECT カラム1,MAX(カラムX) AS カラムX 15 FROM( 16 SELECT カラム1,カラムX 17 FROM テーブルCopyA 18 UNION ALL 19 SELECT カラム1,カラムX 20 FROM テーブルCopyB 21 )AS 別名1 22 GROUP BY カラム1 23)AS 別名2 24INNER JOIN テーブルA 25ON テーブルA.カラム1 = 別名2.カラム1 26RIGHT JOIN テーブルB 27ON テーブルB.カラム1 = テーブルA.カラム1;

現行のSQLを崩していただいてもかまいません。
質問に不備があるかと思いますので、指摘いただき次第追記していきます。
よろしくお願いします。

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

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

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

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

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

sazi

2018/11/20 07:44

SQLを見直して修正して下さい。定義と名称があっていません。
sazi

2018/11/20 08:01

テーブルB系でカラム1とかにまだなってます。
hop

2018/11/20 08:07

カラム1はAもBも同じカラムなので、CREATE文を修正しました。
guest

回答2

0

ベストアンサー

COPYしたテーブルの最終更新日時以降に、変更のあった元テーブルのデータを抽出したいって事だと思うので
※追加も考慮

SQL

1SELECT * 2FROM ( 3 select * from テーブルA as A 4 where カラムX >(select max(カラムx) from テーブルCopyA where カラム1=A.カラム1) 5 or not exists(select 1 from テーブルCopyA where カラム1=A.カラム1) 6 ) tA RIGHT JOIN ( 7 select * from テーブルB as B 8 where カラムX >(select max(カラムx) from テーブルCopyB where カラム1=B.カラム1) 9 or not exists(select 1 from テーブルCopyB where カラム1=B.カラム1) 10 ) as tb 11 ON tB.カラム1 = tA.カラム1

投稿2018/11/20 08:20

編集2018/11/20 08:25
sazi

総合スコア25173

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

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

hop

2018/11/20 08:34

>COPYしたテーブルの最終更新日時以降に、変更のあった元テーブルのデータを抽出したいって事だと思うので くみ取っていただいてありがとうございます。 質問が稚拙すぎて誤解をさせてしまいました。 正しくはCopyテーブルの最終更新日以前のデータとの差分を取りたいのです。 なので"where カラムX >(select"の不等号を<=に変更することで期待通りの結果が得られました。 質問は解決しましたが問題が解決したわけではないので これからも質問を投稿すると思います。縁があればまたお願いします。 ありがとうございました。
sazi

2018/11/20 08:45

copy先の更新に漏れが無いかを確認するという事ですか。 比較までは質問になかったので、当然記述は無いですけど、それぞれの対比の抽出なら全然別のSQLになるでしょう。
guest

0

カラムXはAが更新されたときに必ず更新されるのでしょうか?
カラムXがdateでは更新を細かく確認できないですよね
timestamp(datetime)にすればcopyAのカラムXの最大値より大きなカラムXをもつAの
データを抽出すればよいでしょう

sample

SQL

1create table tbl_a1(c1 varchar(20) not null primary key,c2 varchar(20),cx datetime default current_timestamp on update current_timestamp); 2create table tbl_a2(c1 varchar(20) not null primary key,c2 varchar(20),cx datetime); 3insert into tbl_a1 values('x001','y001','2018-11-01 00:00'),('x002','y002','2018-11-01 00:00'),('x003','y003','2018-11-01 00:00'); 4insert into tbl_a2 values('x001','y001','2018-11-01 00:00'),('x002','y002','2018-11-01 00:00'),('x003','y003','2018-11-01 00:00');

とりあえず同期されている状態にします。
ここからa1のデータをいじるとして

SQL

1update tbl_a1 set c2='y002x' WHERE c1 = 'x002'; 2delete from tbl_a1 where c1=('x003'); 3insert into tbl_a1(c1,c2) values('x004','y004');

x002は更新されてcxが現在の日時に、x004のデータは新規データです
x003は削除なのでa1にデータが残りません
このデータをa1→a2にするには

SQL

1insert into tbl_a2 2select * from tbl_a1 where cx>(select max(cx) from tbl_a2) 3on duplicate key update c2=values(c2),cx=values(cx)

とします。
削除分まで同期する場合は

SQL

1delete from tbl_a2 where not exists(select 1 from tbl_a1 where tbl_a2.c1=c1)

も実行しておいてください

投稿2018/11/20 07:50

編集2018/11/20 09:02
yambejp

総合スコア114761

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

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

hop

2018/11/20 07:58

回答ありがとうございます。 すみません、datetime型でした。 質問を修正させていただきました。 >timestamp(datetime)にすればcopyAのカラムXの最大値より大きなカラムXをもつAのデータを抽出すればよいでしょう この方法が分からないのです…。
yambejp

2018/11/20 09:03

追記しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問