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