MySQL查询预订系统 - 如果房间已经预订,则删除条目

时间:2012-01-12 12:25:54

标签: mysql

我一直在敲打这个问题(我是MySQL的新手,请耐心等待)两天,我无法解决这个问题我想做...首先数据:

我有两张桌子,一张像这样的房间:

  • table 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 = Single view_room = Sea check_in date = 2012-02-15 check_out日期= 2012-02-20 我希望它返回可用的id_room(1.1和1.5)。

现在,如果有人想预订 tipe_room = Single view_room = Sea check_in date = 2012-02-19 的房间和 check_out日期= 2012-02-23 我希望它返回可用的id_room(仅1.5)。

我一直在尝试JOIN条件,但是当条件满足时,它排除了所有房间......

我该怎么办呢?

最诚挚的问候,Alex

2 个答案:

答案 0 :(得分:1)

此查询应检查占用的所有四种情况(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'))
)

答案 1 :(得分: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

这里的主要想法是选择房间,然后检查它是否已在子选择中预订。