重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

以下(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 ";


よろしくお願いします。

A 回答 (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)

この回答への補足

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/12 17:48

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



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

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

この回答への補足

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

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

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

補足日時:2013/06/12 12:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/12 17:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!