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

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

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

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

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

206閲覧

mysql 複数条件でのデータ抽出

Iris_777

総合スコア11

MySQL

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

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/01/19 05:19

編集2018/01/19 06:05

現在、Java EEでウェブアプリケーションを作成しています。

機能のひとつとして、二つのテーブルから必要なデータを取得し、それぞれを複数条件にかけて、新しいデータとしてテーブルに登録出来ればと考えております。(マッチングのような感じです・・・)

例えば、
Aテーブル
a_id | a_date | a_starttime | a_endtime

Bテーブル
b_id | b_date | b_starttime | b_endtime | b_menunum | b_checknum

Cテーブル(条件にクリアしたものをここに登録したい)
c_id | c_date | a_id | b_id | b_starttime | b_endtime | b_menunum | b_checknum

各idはユーザに情報を持たせるためにテーブルに含んでいます。

各dateは一致するものだけを抽出。

各starttime,endtimeは時間の指定をしています。(例 12:00 ~ 14:00)
ここではa_starttime ~ a_endtimeの範囲内にb_starttime ~ b_endtimeが含まれている時に抽出したいと考えております。(A,Bそれぞれの時間の登録範囲は9:00 ~ 23:00までとしています)

自身でも調べてみたものの、joinやWHEREでの方法を読んでみましたが理解が難しく、また他の抽出方法もあるのかと思い、こちらで質問させていただきました。
よろしくお願いいたします。

長くなると思いますが、サンプルデータと期待する結果を下記に記入していきます。

A_table
240050 | 20170121 | 11:00 | 14:00
240055 | 20170121 | 10:00 | 13:00
240057 | 20170122 | 10:00 | 12:00
240062 | 20170122 | 15:00 | 18:00

B_table
150030 | 20170121 | 12:00 | 13:30 | b001,b002 | b01
150040 | 20170122 | 9:00 | 11:00 | b002,b004 | b01,b02
150050 | 20170122 | 16:00 | 17:00 | b001 | b03

C_tabele(登録に成功した時の期待値です)
c500001 | 20170121 | 240050 | 150030 | 12:00 | 13:30 | b001,b002 | b01

サンプルより、240050のデータと150030のデータを
a_date = b_date を基準に、a_starttime | a_endtime と b_starttime | b_endtime の比較を行い、マッチングさせ登録したものをC_tableに格納しています。

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

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

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

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

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

yambejp

2018/01/19 05:33

具体的なサンプルデータ、条件とその期待する結果とそのロジックを提示下さい
Iris_777

2018/01/19 06:06

一応、サンプルデータ等を編集し加えました・・・。よろしくお願いいたします。
sazi

2018/01/19 07:04

マッチングで複数に跨る(1:N)場合は無いのですか?ある場合はそのサンプルも追加して方が良いですね。
guest

回答2

0

テーブルBの150050は、テーブルAの240062 の範囲に収まっていませんか?

SQL

1create table tbl_a(a_id int,a_date date,a_starttime time, a_endtime time); 2insert into tbl_a values 3('240050','20170121','11:00','14:00'), 4('240055','20170121','10:00','13:00 '), 5('240057','20170122','10:00','12:00 '), 6('240062','20170122','15:00','18:00 '); 7 8create table tbl_b(b_id int,b_date date,b_starttime time,b_endtime time,b_menunum varchar(30),b_checknum varchar(30)); 9insert into tbl_b values 10('150030','20170121','12:00','13:30','b001,b002','b01'), 11('150040','20170122','9:00 ','11:00','b002,b004','b01,b02'), 12('150050','20170122','16:00','17:00','b001','b03'); 13 14create table tbl_c(c_id int primary key auto_increment,c_date date,a_id int,b_id int,b_starttime time,b_endtime time,b_menunum varchar(30),b_checknum varchar(30)); 15

tbl_Cに挿入

SQL

1insert into tbl_c(c_date,a_id,b_id,b_starttime,b_endtime,b_menunum,b_checknum) 2select a_date,a_id,b_id,b_starttime,b_endtime,b_menunum,b_checknum from tbl_a as a 3inner join tbl_b as b on a_date=b_date and a_starttime<=b_starttime and a_endtime>=b_endtime;

投稿2018/01/19 08:59

yambejp

総合スコア114839

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

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

sousuke

2018/01/19 09:05

「A1ーA2の範囲内にB1ーB2が含まれている」ってややこしいですよね…。 私も「テーブルBの150050は、テーブルAの240062」は完璧に収まっていると思います。あとc_tableはa_idとb_idだけでいいんじゃないかなとかいろいろ思ってしまいます。
yambejp

2018/01/19 09:10

sousukeさん、こんにちは たしかにa_id,b_idだけ保持しておけば、表示するときに参照するだけですね くわえるならtbl_cおa_id,b_idでunique属性を付けておかないと 更新をかけるたびにデータが増えちゃいますので、そのあたりの仕様をきめる必要があります
Iris_777

2018/01/20 05:24

お返事が遅くなって申し訳ございません。お二人方のおっしゃる通り、範囲内であることを見落としておりました・・・。また、c_idの必要性も低いと改めて感じたため、無くす方向で考えております。 ご回答くださった方法で解決できるよう頑張ります。
guest

0

未検証ですがこんな感じですかね。c_idは生成方法が不明なので書いてません。

sql

1isnert c_table( c_date,a_id,b_id,b_starttime,b_endtime,b_menunum,b_checknum) 2select A.a_date,A.a_id,B.b_id,B.b_starttime,B.b_starttime,B.b_menunum,B.b_checknum 3from a_table as A 4 inner join b_table as B on B.a_date=A.b_date 5 and B.b_starttime>=A.a_starttime 6 and B.b_endtime<=A.a_endtime

範囲が含まれているっていうのは被っている箇所が1分でもあればということですかね?

sql

1 inner join b_table as B on B.a_date=A.b_date 2 and B.b_endtime>A.a_starttime 3 and B.b_starttime<A.a_endtime

投稿2018/01/19 08:04

編集2018/01/19 08:12
sousuke

総合スコア3828

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

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

Iris_777

2018/01/20 05:25

本当は時間の範囲を30分刻みで判断したいと考えております・・・。
sousuke

2018/01/20 23:22

30分刻みとはどういう意味ですか?「かぶっている範囲30分以上」という意味ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問