2012-01-12 6 views
0

私は2日間この(私はMySQLの初心者で、患者である)私の頭を叩いています。まずデータ:MySQLのクエリの予約システム - 部屋がすでに予約されている場合、エントリを削除します

私は2つのテーブル、このような部屋に1つ持っている:

  • テーブルROOMS
  • id_roomを| tipe_room | view_room
  • 1.1 |シングル|海
  • 1.2 |シングル|国
  • 1.3 |ダブル|海
  • 1.4 |ダブル|国
  • 1.5 |シングル|海

  • テーブル予約

  • id_reservation | client_number | n_room | check_in | check_out
  • 1 | 1 | 1.1 | 2012-02-20 | 2012-02-24

人がtipe_room付きの部屋を予約したい場合=シングルview_room =海check_in日= 2012年2月15日check_out日= 2012から02 -20私は利用可能なid_room(1.1と1.5)を返すようにします。

人がtipe_room = = 2012-02-23シングルとview_room =海check_in日= 2012年2月19日check_out日で部屋を予約したい場合は、今私はそれをしたいです利用可能なid_roomを返す(わずか1.5)。

は私が...周りの条件のJOINが、条件が満たされたとき、それはすべての部屋を除外しようとしている

私はこれを行うことができますどのように、してください?

敬具、アレックス

答えて

0

は、ここでの主なアイデアは、部屋を選択し、それがすでに選択サブに計上されていないことを確認することです

select * from room where room.view = :view and room.type = :type 
and (select count(*) from reservation r where r.room_id = room.id and 
(r.checkout > :checkin and r.checkin < :checkout) or 
(r.checkin < :checkin and r.checkout > :checkin)) = 0 

このクエリをお試しください。

+0

、 '[NOT] SELECT EXISTS ... 'は、いくつかのデータが存在しないことだけをchckする必要がある場合は、SELECT COUNT(...)...よりもはるかに高速です。 –

+0

良い点セルゲイ –

1

このクエリは、占有のすべての4つの例(A、B、C及びD)を確認する必要があります。

check_in  check_out 
     |=TEST=PERIOD=| 

    |--A--| |--B--| |--C--| <- check_in<period_end AND check_out>period_start 
    |--------D--------| <- check_in<period_start AND check_out>period_end 

これは、完全なクエリである:一般的に

SELECT `id_room` FROM `rooms` 
WHERE `tipe_room`='Single' AND `view_room`='Sea' 
AND NOT EXISTS 
(
SELECT * FROM `reservations` WHERE `n_room`=`rooms`.`id_room` 
AND ((`check_in`<'2012-02-20' AND `check_out`>'2012-02-15') 
OR (`check_in`<'2012-02-15' AND `check_out`>'2012-02-20')) 
) 
関連する問題