2016-05-15 4 views
2

I持って、次のテーブルを結合し、時間条件。予約されている場合は、予約状況を表示します。予約されていない場合は、NULLを表示する必要があります。MySQLのクエリは

私は基本的なクエリで起動した場合..

mysql> select * from room r, booking b where r.id = b.room_id; 
+----+----------+---------+---------------------+---------------------+----------------+ 
| ID | NAME  | ROOM_ID | START    | END     | GUEST   | 
+----+----------+---------+---------------------+---------------------+----------------+ 
| 1 | Room 101 |  1 | 2016-04-01 00:00:00 | 2016-04-30 00:00:00 | Dorian Gray | 
| 1 | Room 101 |  1 | 2016-05-03 00:00:00 | 2016-05-20 00:00:00 | Vanessa Ives | 
| 1 | Room 101 |  1 | 2016-05-21 00:00:00 | 2016-05-30 00:00:00 | Ethan Chandler | 
| 2 | Room 102 |  2 | 2016-05-06 00:00:00 | 2016-05-18 00:00:00 | John Clare  | 
+----+----------+---------+---------------------+---------------------+----------------+ 

それはOK動作しますが、それは私が欲しいものではありません...参加左に見てみましょう...それでも

mysql> select * from room r left join booking b on r.id = b.room_id; 
+----+----------+---------+---------------------+---------------------+----------------+ 
| ID | NAME  | ROOM_ID | START    | END     | GUEST   | 
+----+----------+---------+---------------------+---------------------+----------------+ 
| 1 | Room 101 |  1 | 2016-04-01 00:00:00 | 2016-04-30 00:00:00 | Dorian Gray | 
| 1 | Room 101 |  1 | 2016-05-03 00:00:00 | 2016-05-20 00:00:00 | Vanessa Ives | 
| 1 | Room 101 |  1 | 2016-05-21 00:00:00 | 2016-05-30 00:00:00 | Ethan Chandler | 
| 2 | Room 102 |  2 | 2016-05-06 00:00:00 | 2016-05-18 00:00:00 | John Clare  | 
| 3 | Room 103 | NULL | NULL    | NULL    | NULL   | 
+----+----------+---------+---------------------+---------------------+----------------+ 

、それを重複を示しています...のは、以上の条件で試してみましょう:

mysql> select * from room r left join booking b on r.id = b.room_id where b.start<now() and b.end>now(); 
+----+----------+---------+---------------------+---------------------+--------------+ 
| ID | NAME  | ROOM_ID | START    | END     | GUEST  | 
+----+----------+---------+---------------------+---------------------+--------------+ 
| 1 | Room 101 |  1 | 2016-05-03 00:00:00 | 2016-05-20 00:00:00 | Vanessa Ives | 
| 2 | Room 102 |  2 | 2016-05-06 00:00:00 | 2016-05-18 00:00:00 | John Clare | 
+----+----------+---------+---------------------+---------------------+--------------+ 

は「ルーム103」は示されていないので、[OK]を...しかし、間違った(それは予約ではないです)。.. 。

+----+----------+---------+---------------------+---------------------+--------------+ 
| ID | NAME  | ROOM_ID | START    | END     | GUEST  | 
+----+----------+---------+---------------------+---------------------+--------------+ 
| 1 | Room 101 |  1 | 2016-05-03 00:00:00 | 2016-05-20 00:00:00 | Vanessa Ives | 
| 2 | Room 102 |  2 | 2016-05-06 00:00:00 | 2016-05-18 00:00:00 | John Clare | 
| 3 | Room 103 | NULL | NULL    | NULL    | NULL   | 
+----+----------+---------+---------------------+---------------------+--------------+ 

任意のアイデア:

私はこのような何かを取得したいのですが?

+0

sqlfiddleはありますか? – Strawberry

+0

私はちょうど1つを作成しました:) http://sqlfiddle.com/#!9/52b53 – hosselausso

答えて

2

は、私はあなたが日付を格納する日時を使用している理由を理解しない...とにかく...以下

SELECT * 
    FROM room r 
    LEFT 
    JOIN booking b 
    ON b.room_id = r.id 
    AND CURDATE() BETWEEN b.start AND b.end; 
+0

元の問題には時間も含まれているので、私はdatetimeを使用します...しかしあなたは正しいです。それはうまくいった!ありがとう! :) – hosselausso

+0

名前が別のテーブル "user"を指しているIDだったら、少し複雑になるでしょうか? http://sqlfiddle.com/#!9/33b2d3/2 – hosselausso

+0

これはちょうど別の参加です – Strawberry

0

問合せは、あなたが探している結果を与える必要があります。 SELECT * FROMルームはすべての客室番号とSELECT * FROM予約bを提供します。b.startとb.endとb.endは、あなたのSTARTとENDの日付内に今日の日付を含むレコードを提供します。次に、LEFT JOINサブクエリON r.id = b.room_idを持つメインクエリです。

SELECT * FROM room r LEFT JOIN 
(SELECT * FROM booking b WHERE CURDATE() BETWEEN b.start AND b.end) b ON r.id = b.room_id; 
+0

ええ、それはあまりにもうまくいくようです:)上記の答え(選択内で選択せずに)と比較した場合の利点は何でしょうか? – hosselausso

+0

@hosselaussoそれは簡単です。これは、他の答えよりも利点を提供しません。理由を確認するには、次の手順に従ってください。1.予約(room_id、start)にPRIMARY KEYを追加します。 2.各テーブルに数十の行を追加します。 3.両方のクエリのパフォーマンスを比較します。 4.両方のクエリでEXPLAINを実行します。私は首を張って、a)私の答えは上記の答えよりもインデックスの利点を生かし、b)中間結果に返される行が少なくなり、c) )全体的に速い。 – Strawberry

+0

@Strawberryあなたの答えは私のものより良かった。私は自分の投稿を投稿したときに自分の答えを投稿しました。私はあなたのポストを見てすぐに+1をくれました。 – josemr