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