Николай Ланец
4 апр. 2013 г., 2:15

Поиск свободных номеров по дате

Вот такой вопрос (по хитрому запросу): у меня в базе хранится информация о забронированных номерах. Структура таблицы следующая:
( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `item` int(10) unsigned NOT NULL, `datefrom` datetime NOT NULL, `datetill` datetime NOT NULL, PRIMARY KEY (`id`), KEY `item` (`item`,`datefrom`,`datetill`) )
То есть каждая запись содержит информацию с какого (datefrom) по какое (datetill) номер забронирован. Мне надо по условию (желаемые даты въезда и отбытия) найти свободные номера. То есть это будут номера, для которых на указанные даты нет брони.
Мой запрос такой:
<?php print '<pre>'; $datefrom = "2013-04-06 12:00:01"; $datetill = "2013-04-08 11:59:59"; $c = $modx->newQuery('HotelRoomItem'); $c->leftJoin('HotelRoomReserve', 'Reserves', "Reserves.item=HotelRoomItem.id AND ( (Reserves.datefrom between '{$datefrom}' AND '{$datetill}') OR (Reserves.datetill between '{$datefrom}' AND '{$datetill}') OR (Reserves.datefrom < '{$datefrom}' AND Reserves.datetill > '{$datetill}') )" ); $c->select(array( 'HotelRoomItem.id as item_id', 'Reserves.*', )); $where = array( 'HotelRoomItem.active' => 1, 'Reserves.id' => null, ); $c->where($where);
Конечный запрос:
SELECT HotelRoomItem.id as item_id, Reserves.* FROM `modx_hotel_room_items` AS `HotelRoomItem` LEFT JOIN `modx_hotel_room_reserve` `Reserves` ON Reserves.item=HotelRoomItem.id AND ( (Reserves.datefrom between '2013-04-06 12:00:01' AND '2013-04-08 11:59:59') OR (Reserves.datetill between '2013-04-06 12:00:01' AND '2013-04-08 11:59:59') OR (Reserves.datefrom < '2013-04-06 12:00:01' AND Reserves.datetill > '2013-04-08 11:59:59') ) WHERE ( `HotelRoomItem`.`active` = 1 AND `Reserves`.`id` IS NULL )
Вопрос: есть ли у кого какие-нибудь мысли по этому поводу? Может более оптимальный запрос возможен?

Добавить комментарий