Допустим, у вас есть база данных отелей. Каждый отель создает в базе данных множество тарифов, каждый с from_date
и to_date
. Тарифы гарантированно никогда не перекрываются.
В каждом тарифе менеджер отеля может установить минимальное пребывание на этот период. Например, с 1 декабря по 30 января минимальный срок пребывания составляет 10 ночей.
Теперь путешественник вводит свои даты, например, с 25 декабря по 1 января. В этом случае этот отель должен быть возвращен в результатах , а не , поскольку с 1 декабря по 30 января действует тариф, предусматривающий проживание не менее 10 ночей.
Я не могу придумать способ запроса этой базы данных (используя SQL или Elasticsearch, который является нашей поисковой системой на данный момент), чтобы избежать возврата отелей с более высоким минимальным пребыванием в этом диапазоне дат.
В SQL я бы исследовал путь joining
таблицы Hotels с таблицей тарифов, используя WHERE
, чтобы получить тарифы, которые перекрывают даты, желаемые путешественником (возможно, с использованием алгоритма (StartA <= EndB) and (EndA >= StartB)
), плюс агрегатная функция, такая как MAX()
, чтобы получить максимум min_stay
найденных тарифов, и, наконец, HAVING
, чтобы указать его, должна быть> тогда количество ночей, которое существует в диапазоне, предоставленном путешественником.
Но даже этот путь мне неясен, так как, когда я присоединяюсь к столу, я исключаю отели без каких-либо настроенных тарифов, а это нежелательно; может быть, левое внешнее соединение? И как перевести это наasticsearch должно быть еще более сложной задачей (возможно, с использованием чего-то вроде агрегации ведра, описанной здесь https://stackoverflow.com/a/46953947/1290457)