こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

少し複雑な left join

まだデーターベースを独学で始めて数ヶ月の初心者です。

以下(3行目のleft join)の記述では動かないのですが、どのように
記述したらよいのでしょうか?

やりたい内容は3行目にあるようにbookedというテーブルの中のdateが
2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join
させたいです。


1 "select *
2 from
3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b
4 on
5 t.start >= b.startTime and t.start < b.finishTime ||
6 t.finish > b.startTime and t.finish <= b.finishTime
7 where
8 t.time >
9 (select start
10 from class as c left join member as m
11 on c.className = m.class
12 where m.name = '$name')
13 )
14 ";


よろしくお願いします。

投稿日時 - 2013-06-12 11:22:54

QNo.8130482

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

where以降意味がわからないので割愛して、
とりあえず普通にjoinするやりかたはこう

select * from timeTpl as t
left join booked as b on
b.date ='2013-06-05'
and (
t.start >= b.startTime and t.start < b.finishTime or
t.finish > b.startTime and t.finish <= b.finishTime)

投稿日時 - 2013-06-12 12:34:07

補足

yambejpさん

いつもお世話様です。
いただいたjoinはたぶんちょっと違うみたいです。

やりたい事は、会員制整体の予約のシステムを構築してまして、
会員の方は(クラス)という、とれる予約の時間帯の制約があります。

店内の流れとしては、(予約時間)から器械にのる⇒(x分後)から先生の
矯正が始まる。みたいに矯正時間と先生が施術を開始する時間は違っています。
先生の矯正時間がかぶらなければ、矯正中に次の方が器械にのり始める事も
可能という前提の作りです。

以下が設定した環境です。

■[booked] as b
予約済みのデーターを収めたテーブル

(date:予約の日付)
(rsvTime:予約時間)
(startTime:先生の矯正開始時間)
(finishTime:先生の矯正終了時間)


■[timeTpl] as t
一日の予約受付時間のテンプレートテーブル

(time:予約受付の時間)ex.10:00,11:15, 12:30, 15:00・・・
(start:上記の場合の先生の矯正開始時間)
(finish:上記の場合の先生矯正終了時間)


■[member] as m
会員さまの基本情報を納めたテーブル。
名前、住所、電話等の他に、その方が予約を取る際の時間の制約(区分)
である「class:クラス」というカラムを設けています。

例えば、
aクラスは、10:00から17:00までしかとれない。
bクラスは、18:00から21:00までしかとれない。
など・・・

■[class] as c
上記に示した、クラスの条件テーブル

(className:クラスの名前)
(start:そのクラスの予約受付開始時間)
(finish:そのクラスの予約受付終了時間)


◆◆私がやりたい事は◆◆

(1)予約済みのDB[booked]から、(ある日)の予約データーのみを抽出・・・(A)

(2)(A)には複数の予約済みデーターが入っており、
【それらの先生の施術に関わる時間】と、
   ↓ ↑
【予約受付時間のDB[timeTple]の
  (start:上記の場合の矯正開始時間)
  (finish:上記の場合の矯正終了時間)】
を比較して、かぶっているところをleft join でonの結合条件にしたい。
(結合されたrsvTimeがあるところはつまり予約済みを意味し、
空のところはまだ予約が取れるという作りです)

(3)その際に、その会員の方の属しているクラスのみを抽出したい。

上記を踏まえ、私の考えたsqlが以下です。(うまく動きませんが)
----------------------------------------------------------------------
1 "select *
2 from
3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b
4 on
5 t.start >= b.startTime and t.start < b.finishTime ||
6 t.finish > b.startTime and t.finish <= b.finishTime
7 where
8 t.time >
9 (select start
10 from class as c left join member as m
11 on c.className = m.class
12 where m.name = '$name')
13 )
14and
15 time <
16 (select finish
17 from class as c left join member as m
18 on c.className = m.class
19 where m.name = '$name'
20 )";
----------------------------------------------------------------------

どこがいけないのでしょうか?
よろしくお願いします。

投稿日時 - 2013-06-12 17:12:03

お礼

わかりにくいところご回答いただきありがとうございます。

投稿日時 - 2013-06-12 17:48:41

ANo.1

SQL文が冗長でいまいち何をしたいかわからないのですが

left join するのはサブクエリではなくbookedでよいのでは?
where句の処理は意味がわからない

timeTplとbookedの簡単な例を書いて、それをどう連携してどういうデータを
取りたいか書いた方が適切な回答がつきやすいと思います

投稿日時 - 2013-06-12 12:02:11

補足

要領を得ない質問で申し訳ございません。

where句及び全体の内容は仮に無視し、3行目だけにスポットをあてて
見た時に、記述の仕方として問題があるのか、もしくは冗長でスマートでは
ないけど、動かないはずはないのか、をまず教えていただければありがたいです。

後程また再度全体が分かるようきちんと質問させていただきます。

投稿日時 - 2013-06-12 12:10:48

お礼

ご回答及びアドバイスありがとうございます。

投稿日時 - 2013-06-12 17:47:38

あなたにオススメの質問