Fi1osof 04 апреля 2013 0 0
Вот такой вопрос (по хитрому запросу): у меня в базе хранится информация о забронированных номерах. Структура таблицы следующая:
(
  `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 )


Вопрос: есть ли у кого какие-нибудь мысли по этому поводу? Может более оптимальный запрос возможен?
0 комментариев
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.