2014-02-16 2 views
4

Я использую один стол, mrp для хранения многокомнатных номеров и второго бронирования столов, чтобы сохранить даты, в которые была забронирована недвижимость. я, таким образом, имеют следующие таблицы:MySQL, использующий счет в запросе для поиска доступности нескольких строк

MRP (PROPERTY_ID, property_name, num_rooms)

бронирование (PROPERTY_ID, booking_id, дата)

Всякий раз, когда свойство получает предупреждение, сделана запись в таблице бронирования и потому, что каждая таблица имеет несколько комнат, она может иметь несколько заказов в тот же день.

Я использую следующий запрос:

SELECT * FROM mrp 
    WHERE property_id 
    NOT IN (SELECT property_id FROM booking WHERE `date` >= {$checkin_date} AND `date` <= {$checkout_date} 

)

Но хотя этот запрос будет работать нормально для недвижимость с одной комнатой (то есть, в нем перечислены только те свойства, которые не были забронированы в целом между датами, которые вы предоставляете), он не отображает свойства, которые были забронированы, но все еще имеют свободные комнаты. Как мы можем использовать счет и таблицу num_rooms, чтобы показать в моих результатах комнаты, которые все еще свободны, даже если у них уже есть бронирование между выбранными датами, и отображать в моих результатах количество свободных номеров.

+2

+1 для попытки, давая нам хороший пример и прилагая усилия при написании вопроса. – Aquillo

ответ

0

Вы близки, но вы должны изменить состояние даты и добавить условие, чтобы соответствовать записи от внешних и внутренних запросов (все в WHERE пункте внутреннего запроса в):

SELECT * FROM srp 
WHERE NOT EXISTS 
    (SELECT * FROM bookings_srp 
    WHERE srp.booking_id = bookings_srp.booking_id 
    AND `date` >= {$check-in_date} AND `date` <= {$check-out_date}) 
0

Вы должны исключить свойства, которые забронированы между датой регистрации и датой выписки. Этот запрос должен сделать:

SELECT * FROM srp WHERE property_id NOT IN (
    SELECT property_id FROM booking WHERE `date` >= {$checkin_date} AND `date` <= {$checkout_date} 
) 
+1

Буду очень признателен, если проголосовавший может пролить свет на то, почему он был проголосован. – RaviH

1

Вам нужны 3 уровня запроса. В самом внутреннем запросе будут перечислены свойства и даты, когда все номера будут полностью забронированы (или забронированы) в любой день вашего диапазона дат. Средний запрос сужает это только до списка свойств. В самом внешнем запросе перечислены все свойства, которые НЕ находятся в этом списке.

SELECT * 
FROM mrp 
WHERE property_id NOT IN (
    -- List all properties sold-out on any day in range 
    SELECT DISTINCT Z.property_id 
    FROM (
     -- List sold-out properties by date 
     SELECT MM.property_id, MM.num_rooms, BB.adate 
     , COUNT(*) as rooms_booked 
     FROM mrp MM 
     INNER JOIN booking BB on MM.property_id = BB.property_id 
     WHERE BB.adate >= @checkin AND BB.adate <= @checkout 
     GROUP BY MM.property_id, MM.num_rooms, BB.adate 
     HAVING MM.num_rooms - COUNT(*) <= 0 
    ) as Z 
) 
+0

Отлично! Я думаю, что мы приближаемся. В этом запросе будут перечислены только доступные свойства. Как я могу получить этот запрос, чтобы показать количество доступных комнат? – user1227793

Смежные вопросы