• 締切済み

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

  • MySQL
  • 回答数2
  • ありがとう数2

みんなの回答

  • 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行目だけにスポットをあてて 見た時に、記述の仕方として問題があるのか、もしくは冗長でスマートでは ないけど、動かないはずはないのか、をまず教えていただければありがたいです。 後程また再度全体が分かるようきちんと質問させていただきます。

関連するQ&A

  • sql(left join)の結合条件のルール

    (テーブルA)と(テーブルB)をleft joinした際の結合条件について 詳しい方に伺いたいのですが、 on以下の部分は、(テーブルAの中にあるカラム)と(テーブルBの中にあるカラム)を 比較するような文でなければいけないですか? 例えば、、、 ------------------------------------------------------------------------- SELECT * FROM  timeTpl2 AS t LEFT JOIN booked AS b ON  t.start = b.startTime AND  b.settingDay = $day ------------------------------------------------------------------------- 上記の最後の部分(b.settingDay = $day)は テーブルbにしかない要素を変数($day)と比較しています。 ◆疑問 記述としてだいじょうぶかどうかを知りたいです。 つまりon以下結合条件は必ず左右のテーブルの、存在するカラム のみしか比較する事ができないかどうかが知りたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • Left Joinについて

    Left Joinについて select * From shohin left join meisho on sh03 = me02 and me01 = 1 where **** select * From shohin left join meisho on sh03 = me02 where me01 = 1 left joinの中に me01 = 1があるパターンとwhere句に me01 = 1 があるパターンで検索結果が変わってくる具体的にどう変わるのでしょうか 良く理解ができていないので教えてください

  • left join が3つ以上のとき

    例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

  • どちらのLEFT JOINが早いでしょうか?

    下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?

    • ベストアンサー
    • MySQL
  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • ~JOIN ON句でこのような問い合わせはできるのでしょうか?

    SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard

    • ベストアンサー
    • MySQL
  • MySQLのLEFT JOINについて

    LEFT JOINを使ったMySQLに挑戦しています。 テーブルとテーブルを照らしあわせ、右側のテーブルに優先的に表示する方法ですが、1つのテーブルと1つのテーブルではなく1つのテーブルに対して複数のテーブルと照合する方法とはあるのでしょうか? どうかおしえていただけないでしょうか? 下記に作成中のソースを示します。 宜しくお願いします。 $STRSQL=qq{SELECT }; $STRSQL=$STRSQL.qq{kyu_table.iput_charg_id,k_data_m_table.iput_charg_id }; $STRSQL=$STRSQL.qq{FROM k_data_m_table LEFT JOIN kyu_table ON k_data_m_table.iput_charg_id = kyu_table.iput_charg_id }; $STRSQL=$STRSQL.qq{WHERE k_data_m_table.iput_charg_id = "$KYU" };

  • LEFT JOINの使い方

    linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。

    • ベストアンサー
    • MySQL