• 締切済み

少し複雑な 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 "; よろしくお願いします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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)

hayaken73
質問者

お礼

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

hayaken73
質問者

補足

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 ) 14 and 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 )"; ---------------------------------------------------------------------- どこがいけないのでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

SQL文が冗長でいまいち何をしたいかわからないのですが left join するのはサブクエリではなくbookedでよいのでは? where句の処理は意味がわからない timeTplとbookedの簡単な例を書いて、それをどう連携してどういうデータを 取りたいか書いた方が適切な回答がつきやすいと思います

hayaken73
質問者

お礼

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

hayaken73
質問者

補足

要領を得ない質問で申し訳ございません。 where句及び全体の内容は仮に無視し、3行目だけにスポットをあてて 見た時に、記述の仕方として問題があるのか、もしくは冗長でスマートでは ないけど、動かないはずはないのか、をまず教えていただければありがたいです。 後程また再度全体が分かるようきちんと質問させていただきます。

すると、全ての回答が全文表示されます。

専門家に質問してみよう