2016-02-23 5 views
6

私のデータベースには2つのテーブルがあります。最初のテーブルは部屋、2番目のテーブルは予約です。私の予約テーブルにホテルの部屋の空き状況を確認してください

id room_no type rate 
1 13  1b 1000 
2 14  2b 2000 
3 15  3b 3000 
4 16  1b 1000 
5 17  2b 2000 
6 18  3b 3000 

自分の部屋のテーブルでは

id room_no check_in  check_out 
1 13  23-2-2016  24-2-2016 
2 14  24-2-2016  25-2-2016 
1 13  25-2-2016  26-2-2016 
1 13  27-2-2016  29-2-2016 
1 13  1-3-2016  2-3-2016 
1 13  7-3-2016  7-3-2016 

"SELECT room_no,type,rate 
      FROM room 
      WHERE room_no not in 
      (select IFNULL(GROUP_CONCAT(room_no),0) 
      FROM reservation 
      WHERE check_out >= '$check_in' AND check_in <= '$check_out')" 

私は24-2-2016 27-2-2016に日付を選択し、それは

room_no check_in  check_out 

    14  24-2-2016  25-2-2016 
    15  25-2-2016  26-2-2016 
    16  27-2-2016  29-2-2016 
    17  1-3-2016  2-3-2016 
    18  7-3-2016  7-3-2016 

が、私を表示します利用可能なすべての部屋が欲しい。

+1

あなたはちょうどチェックアウトの日付と現在の日付と比較する必要があります。 –

+0

日付ピッカーのテキストボックス.soで日付を選択します。私は24-2-2016から27-2-2016の日付を選択しますので、room_noを表示します。 、15,16,17と18しかし、私はこれらの日付の間にないroom_noを欲しいです。私は利用可能な部屋 –

答えて

0

あなたはこのようなものを使用する必要があります

"SELECT room_no, type, rate 
     FROM room 
     WHERE room_no not in 
     (select room_no FROM reservation 
     WHERE ('$check_in' BETWEEN check_in AND check_out) AND ('$check_out' BETWEEN check_in AND check_out))" 

クエリが正しいかどうかはわからないが、しかし、あなたは確かに間をチェックする必要があります。 check_out>の日付をテストするだけでなく、check_in <の日付をテストすることはできません。あなたが複数の予約をしている場合、これはあなたにエラーを与えるでしょう!

+0

それはエラーDoktor OSwaldo –

+0

かなり可能であることを意味する、あなたは日付を比較する必要があります、あなたはいくつかの日付機能を追加する必要があります。とにかくクエリを少し更新しましたが、あなたもいくつかの作業を投資する必要があります;) –

4

'2016-02-27'-'2016-02-24'つまり、あなたが使用することができ、指定した期間のための部屋を占領するには:

SELECT DISTINCT room_no 
FROM reservation 
WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24' 

出力:

room_no 
======= 
13 
14 

利用可能なお部屋を取得するには、このような前のクエリを使用することができます:

SELECT * 
FROM room 
WHERE room_no NOT IN (
    SELECT DISTINCT room_no 
    FROM reservation 
    WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24') 

出力:LEFT JOINを使用して

id, room_no, type, rate 
======================= 
3, 15,  3b, 3000 
4, 16,  1b, 1000 
5, 17,  2b, 2000 
6, 18,  3b, 3000 

Demo here

+0

このクエリは、 '予約で利用可能な部屋がない場合、エラーを返します。 IFNULL条件を使用してください。 –

+0

どのようにエンジニア。 –

+0

@ Mr.Engineerいいえ、これは正しくありません。予約が空の場合、クエリはすべての部屋を返します。 –

0

は、サブクエリを使用せずにトリックを行う必要があります。このような

何か:

SELECT 
    room.room_no, 
    room.`type`, 
    room.rate, 
    COUNT(reservation.room_no) AS countReservation 
FROM 
    room 
LEFT JOIN reservation 
    ON (room.room_no = reservation.room_no) 
     AND (check_in <= '2016-02-24' AND check_out >= '2016-01-27') 
GROUP BY 
    room.room_no 
HAVING 
    countReservation = 0 

このクエリ内の他の利点は、各部屋のために与えられた時間枠のためにのための1つの以上の予約を持っている場合でも、あなたを教えてくれます余分な列countReservationです。

+0

親愛なるベンジャミン...クエリは機能していますが、クエリとGiorgos Betsosクエリの違いは何ですか.iは何を言おうとしているのか理解できませんでした。適切に説明してください....ありがとう –

+0

よくある点はいくつかあります。一般に、結合を使用する方が副照会( 'SELECT'節内の' SELECT'節)を使用するよりも高速です。また、サーバがサブクエリの結果をインデックスし、その後にその逆をチェックしなければならないため、 'NOT IN(...)'条件は高速ではありません。 FYI私の前提を確認するリンクはありません。中規模のデータベース(例:140k連絡先の行と70k社の行)の過去のプロジェクトの個人的な経験からのみです。 –

関連する問題