2017-09-09 12 views
0

enter image description hereSQLクエリoverlaping時間

は、私はクラスの予約名book用のテーブルを持っています。 roomと呼ばれる部屋のデータを持つテーブルもあります。

私は、部屋が既に08:00から09:00までの特定の時間帯に予約されている場合、クラスを予約することはできません。しかし、そうでない場合はできます。

私のSQLは次のとおりです。

SELECT * FROM book WHERE room_id = '$room_id' and start_date = '$date' and start_time = '$starttime' BETWEEN (SELECT MIN(start_time) AS mintime 
FROM book WHERE room_id = '$room_id' and start_date = '$date') and (SELECT MAX(end_time) AS maxtime 
FROM book WHERE room_id = '$room_id' and start_date = '$date') 

SQLが行を返した場合、ユーザーが部屋を予約傾けます。

時にはこのSQLは機能しますが、失敗することがあります。 ここで私は何をしていますか?

答えて

0

それは多くの場合、あなたが読みやすい形式でクエリを書き出す場合に役立ちます:

SELECT * 
FROM book 
WHERE room_id = '$room_id' AND 
     start_date = '$date' AND 
     start_time = '$starttime' 
BETWEEN (SELECT MIN(start_time) AS mintime 
     FROM book 
     WHERE room_id = '$room_id' AND 
       start_date = '$date') AND 
     (SELECT MAX(end_time) AS maxtime 
     FROM book 
     WHERE room_id = '$room_id' AND 
       start_date = '$date') 

は、今あなたが一つだけのテーブル、すなわちbookが、2つのサブクエリを使うはっきり見ることができます。これはちょっと思われますが、あなたは正しい方法でBETWEENを使用していません。なぜこのようなクエリをしないのですか?

SELECT * 
FROM book 
WHERE room_id = '$room_id' AND 
     start_date = '$date' AND 
     '$starttime' BETWEEN start_time AND end_time 

私はもちろん、warn about SQL-injectionです。

+0

ありがとうございました!私はそれを変更し、それは働いた。問題が発生した場合は、後でお客様にご連絡いたします。歓声! –