здесь мои данные:
Стол: 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
но он не работал должным образом.
любые идеи, как его решить? Спасибо
Я думаю, вы хотите что-то подобное для комнат для каждого пользователя:
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
Чтобы получить свой первый результат, просто используйте это как подзапрос и агрегат снова.