• 締切済み
  • すぐに回答を!

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数253
  • ありがとう数2

みんなの回答

  • 回答No.2
  • yambejp
  • ベストアンサー率51% (3827/7415)

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

関連する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
  • 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 があるパターンで検索結果が変わってくる具体的にどう変わるのでしょうか 良く理解ができていないので教えてください

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

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

関連するQ&A

  • 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つのテーブルがあったとします。 ・大テーブル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
  • 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
  • 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つある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
  • ACCESS での LEFT JOIN 時の WHERE 句の使用について

    以下のテーブル1、テーブル2で、 テーブル2のDATE2が、テーブル1のDATE以前になっている VOL2を集計したいと考えています。 テーブル1 CODE   DATE     VOL --------------------------- a     20080601  100 a     20080602  100 a     20080603  100 テーブル2 CODE   DATE2    VOL2 ------------------------ a     20080602   50 a     20080603   50 希望する結果のイメージ CODE   DATE     VOL    VOL2 --------------------------------------- a    20080601   100     0 a    20080602   100     50 a    20080603   100    100 以下のSQLを考えましたが、DATE以前のDATE2を持たない場合、 テーブル1の行が表示されませんでした。 SQL文 SELECT t1.CODE, t1.DATE, t1.VOL , Sum(t2.VOL2) AS VOL2の合計 FROM テーブル1 as t LEFT JOIN テーブル2 as t2 ON t1.CODE = t2.CODE WHERE t1.DATE >= t2.DATE2 GROUP BY t1.CODE, t1.DATE, t1.VOL 結果 CODE   CDATE   VOL   VOL2の合計 -------------------------------------- a    20080602  100    50 a    20080603  100   100 SQL文中にある WHERE t1.DATE >= t2.DATE2 が原因しているのではと考えています。 しかし、どのようにしたらよいのかがわかりません。 どなたか、ご教授をお願いします。

  • LEFT JOIN の結合結果について

    お世話になります。 ”SELECT Aテーブル.* Bテーブル.*  FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を 行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか? よろしくお願いします。 ※ORACLE 9i、PL/SQL上での処理を考えています

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • LEFT OUTER JOIN でB表の制限付きで表示したいのですが

    はじめまして。midwagonです。 SQLがわからないので教えてください。 A表:id,name B表:id,hiduke これを結合してA表にあるものをすべて表示したいのですが B表のhiduke="20080531" と 日付の制限をかけると何もかえってきません。 どうすればいいのか教えてください。 select A.id,A,name from A left outer join B on A.id=B.id where B.hiduke="20080531";

  • LEFT JOINの記述の仕方について

    お世話になっております。 LEFT JOINの記述の仕方でご確認したい事があります。 ご教授頂けますようお願いいたします。 【ご質問内容】 以下のようなSQLをLEFT JOINを使用して記述する場合、 どのように記述すればよろしいのでしょうか? SELECT A.* FROM A B C WHERE A.COLUMN1 = B.COLUMN1 AND B.COLUMN2 = C.COLUMN2(+) AND B.COLUMN3 = C.COLUMN3(+) AND A.COLUMN4 = C.COLUMN4(+) ;