FMars
@FMars

Как сделать запрос SQL?

Есть две таблицы, Apartment и Apartment_Dates, в Apartment_Dates хранится информация в какой промежуток времени моя квартира недоступна (от arrival_time до departure_time), таких промежутков может быть много, например, квартира не доступна с (2014 по 2015) и с (2016 по 2017), тоесть квартира с (2015 по 2016) - доступна.
Подскажите, пожалуйста, как сделать запрос на выдачу доступных квартир по указанной дате.
a014b6322f3848fead9cfb5f5bd17776.png
  • Вопрос задан
  • 2341 просмотр
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
ИМХО, у @alexclear переусложнено. Можно проще:

SELECT a.* FROM Apartment a
  LEFT JOIN Apartment_Dates ad
    ON ad.apartment_id=a.id AND ? BETWEEN ad.arrival_time AND ad.departure_time
  WHERE ad.id IS NULL

Что касается решения @Serhioromano, то в MySQL есть такая неприятная особенность: конструкция IN (SELECT ...) вычисляется для каждой строки выбираемой таблицы. Т.е. если в таблице Apartment 1000 записей, то (SELECT FROM Apartment_Dates) при выполнении запроса будет вычислено 1000 раз. Понятно, что работает это намного медленнее, чем JOIN и exists().
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
alexclear
@alexclear
A cat
select a.id, a.location from apartments a
   where not exists (select d.apartment_id
            from apartment_dates d 
                    where d.apartment_id = a.id
                          and d.arrival_time<=? and d.departure_time>=?)


где ? - указанная дата.
Ответ написан
Комментировать
Serhioromano
@Serhioromano
Web Developer
Нужно воспользоваться таблицей Apartment_Dates как индексом. И на моем опыте < и > быстрее BETWEEN.

Лучше воспользоваться обратной логикой чем прямой. Так как при промежутки свободные находятся в разных рядах записей.

SELECT a.* 
  FROM Apartment AS a
 WHERE a.id NOT IN(SELECT apartment_id 
    FROM Apartment_Dates 
   WHERE  ? <= departure_time AND ? >= arrival_time)


Где ? это ваша дата.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы