Как вернуть ТОЛЬКО идентификаторы свойств, у которых нет существующего бронирования, из диапазона дат, введенного пользователем? - PullRequest
1 голос
/ 01 апреля 2019

Я настраиваю поиск недвижимости на сайте аренды недвижимости для отпуска. Поиск принимает параметры для даты прибытия и даты отъезда. Свойства имеют несколько повторяющихся дат, поскольку им разрешено импортировать несколько символов для каждого свойства, чтобы интегрировать бронирования. Как я могу написать запрос, который возвращает ТОЛЬКО идентификаторы свойств, у которых нет существующих забронированных дат в отношении пользовательского ввода?

По сути, я хотел бы вернуть все свойства, которые доступны в диапазоне дат из пользовательского ввода.

Попробовал это.

SELECT p.name 
FROM property AS p
INNER JOIN property_calendar AS pc
ON p.id = pc.property_id
WHERE COALESCE('2018-11-17' NOT BETWEEN pc.start AND pc.end, TRUE)
      AND COALESCE('2018-11-19' NOT BETWEEN pc.start AND pc.end, TRUE)

Таблицы БД: (показаны только соответствующие столбцы)

1010 * недвижимость *

id | name 
-------------------------------------
1  | Beaches & Flows
2  | Mo Beaches Mo Problems
3  | 99 Problems and they all Beaches

property_calendar

id | property_id | start (Y-m-d) | end (Y-m-d) 
----------------------------------------------
1  | 1           | 2019-3-13     | 2019-3-17
2  | 1           | 2019-4-13     | 2019-4-17
3  | 1           | 2019-3-13     | 2019-3-17
4  | 1           | 2019-3-13     | 2019-3-17
5  | 2           | 2019-3-13     | 2019-3-17
6  | 3           | 2019-5-13     | 2019-5-17
7  | 3           | 2019-6-13     | 2019-6-17
8  | 3           | 2019-7-13     | 2019-7-17

Хотя для каждого свойства в таблице календаря есть повторяющиеся даты, мне бы хотелось, чтобы он возвращал идентификатор свойства только один раз, если он доступен в этом диапазоне дат. Если есть ЛЮБЫЕ случаи, когда дата недоступна для свойства, то в запросе ничего не должно возвращаться.

Я действительно очень ценю любую помощь, которую я могу получить!

1 Ответ

0 голосов
/ 01 апреля 2019

Проверьте наличие перекрытия диапазона дат с подзапросом NOT EXISTS:

set @new_start = '2019-06-16';
set @new_end   = '2019-06-19';

select *
from property p
where not exists (
  select *
  from property_calendar c
  where c.property_id = p.id
    and c.start < @new_end
    and c.end   > @new_start
)

Результат:

id | name
---|-----------------------
1  | Beaches & Flows
2  | Mo Beaches Mo Problems

Свойство 3 исключено, поскольку диапазон (2019-6-13, 2019-6-17) перекрывается с (2019-06-16, 2019-06-19).

В зависимости от того, хотите ли вы разрешить перекрытие в течение одного дня, вам может потребоваться изменить < и > до <= и >=.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...