我一直在敲打这个问题(我是MySQL的新手,请耐心等待)两天,我无法解决这个问题我想做...首先数据:
我有两张桌子,一张像这样的房间:
1.5 |单身|海
表格预订
如果某人想要预订房间 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
答案 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
这里的主要想法是选择房间,然后检查它是否已在子选择中预订。