2016-10-12 1 views
0

Я пытаюсь получить результаты (целые строки) таблицы свойств, используя результат JOIN из 2 таблиц. «Booking_tbl» и «property_tbl». Первое условие заключается в том, что свойство уже не забронировано в течение определенного периода времени (startDate, endDate). Второе условие состоит в том, что число (property_tbl.max_guest) должно быть равно или больше другого заданного числа (variable: num_guest) для размещения всех гостей.Соедините 2 таблицы с фильтром по диапазону дат и номеру

До сих пор, что мне удалось достичь, это:

SELECT * FROM property_tbl 
INNER JOIN booking_tbl ON booking_tbl.propertyId = property_tbl.id 
WHERE NOT booking_tbl.endDate > '17-10-24' AND booking_tbl.startDate < '17-10-31'; 

Вышеприведенные возвращает все доступные свойства, которые происходят в booking_tbl только Перечисления из property_tbl, которые ранее не были забронированы опущены.

После некоторых исследований по этому вопросу, я думаю, что должен использовать ЛЕВЫЙ ПРИСОЕДИНЕНИЕ? What is the difference between "INNER JOIN" and "OUTER JOIN"?

Но, к сожалению, у меня возникли трудности с форматированием запроса и пониманием того, как добавить еще один JOIN и отфильтровать диапазон номеров.

Некоторая помощь с этим запросом была бы весьма признательна.

Спасибо заранее

ответ

1

Чтобы найти строки, которые не сопоставлены в другой таблице, вы можете использовать шаблон LEFT JOIN/NULL. Когда вы используете LEFT JOIN, условия для дочерней таблицы помещаются в пункт ON. Условия в родительской таблице помещаются в пункт WHERE.

SELECT p.* 
FROM property_tbl AS p 
LEFT JOIN booking_tbl AS b 
ON p.id = b.propertyID AND booking_tbl.endDate > '17-10-24' AND booking_tbl.startDate < '17-10-31' 
WHERE b.propertyID IS NULL 
AND p.max_guest > @num_guest 
+0

Это здорово, возвращает ожидаемые результаты и легко понять. Большое спасибо за помощь :) – webstudent

0

Вы должны выбрать свойства, которые имеют достаточный потенциал и являются либо (A) Не заказанные или (B) забронирован, но за пределами диапазона вы запрашивая ниже запрос должен работать:

select id from property_tbl p 
where 
p.capacity > 5 and 
not exists (
    select id from booking_tbl where p_id = p.id) 

union 

select id from property_tbl p 
where 
p.capacity > 5 and 
p.id not in (
    select distinct id from booking_tbl 
    where 
     startDate between '2016-09-17' and '2016-09-22' 
    OR 
     endDate between '2016-09-17' and '2016-09-22' 
) 

Вот SQL Fiddle.

+0

Благодарим за отзыв, что это замечательно, просто немного сложно и уходит от объединений. Я чувствовал более удобное понимание и обертывание вокруг принятого ответа, спасибо за то, что уделил время, хотя – webstudent

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

  • Нет связанных вопросов^_^