MySQL: сложный запрос к сервису бронирования отелей

0

здесь мои данные:

Стол: room_available

    ID  date        user  room_id 
   ------------------------------
    1   2018-04-02  1     10
    2   2018-04-03  1     10
    3   2018-04-04  1     10

    4   2018-04-02  1     20
    5   2018-04-03  1     20
    6   2018-04-04  1     20

    7   2018-04-02  2     11
    8   2018-04-04  2     11

    9   2018-04-01  3     12
   10   2018-04-02  3     12
   11   2018-04-03  3     12
   12   2018-04-04  3     12
   13   2018-04-05  3     12

Я пытаюсь написать функцию поиска для поиска доступных комнат. например, при поиске с 2018-04-02 по 2018-04-04 желаемый результат:

уровень пользователя: (для создания основного набора записей результатов)

user  rooms_available
---------------------
1     2
3     1

уровень комнаты (для каждого пользователя):

user  room_id
-------------
1     10
1     20
3     12

Я столкнулся с несколькими проблемами с моими запросами:

select * from rooms_available where date between '2018-04-02' AND '2018-04-04'

также возвратит записи от пользователя 2, что неверно, поскольку отсутствует диапазон дат 2018-04-03. такой же как:

select * from rooms_available where (date='2018-04-02' OR date='2018-04-03' OR date='2018-04-04')

поэтому в запросе необходимо учитывать количество дней/записей для полного диапазона дат, которое будет равно 3. Я пробовал что-то вроде count(*) и HAVING но он не работал должным образом.

любые идеи, как его решить? Спасибо

  • 1
    Почему пользователь 2 не появляется в вашем наборе результатов? Думаю, у него есть одна комната в этом диапазоне дат.
  • 0
    данные даны для комнаты - как я цитировал, я хочу только комнаты, которые доступны для полного диапазона дат
Теги:

1 ответ

2
Лучший ответ

Я думаю, вы хотите что-то подобное для комнат для каждого пользователя:

select user, room_id
from rooms_available
where date between '2018-04-02' AND '2018-04-04'
group by user, room_id
having count(*) = 3;  -- this is the number of days in the range

Чтобы получить свой первый результат, просто используйте это как подзапрос и агрегат снова.

  • 0
    Это объяснило бы ожидаемый набор результатов +1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню