Mysql - Выберите номера, где есть все даты - PullRequest
0 голосов
/ 07 июня 2018

Привет, у меня есть доступность номеров в таблице, например:

room_id |          date       
   1    | 2018-06-09 00:00:00 
   1    | 2018-06-10 00:00:00 
   1    | 2018-06-11 00:00:00 
   2    | 2018-06-09 00:00:00 
   2    | 2018-06-11 00:00:00 
   3    | 2018-06-09 00:00:00 
   4    | 2018-06-07 00:00:00 
...

Я отправляю массив дат и хочу получить, если какая-либо комната будет доступна для всех дней:

SELECT rtd.room_id, CASE WHEN Count(rtd.room_id) < 2 THEN 'no' ELSE 'yes' END
FROM room_type_day as rtd
WHERE 
rtd.date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', '2018-06-11 00:00:00')
GROUP BY rtd.room_type_id

Но это возвращает меня:

1  | yes
2  | yes
3  | yes
4  | no

Как мне найти номера, которые доступны в любое время дня?

Спасибо.

РЕДАКТИРОВАТЬ

Если я добавлю HAVING (COUNT DISTINCT rtd.date) = 3 "перед" group by ", я получу эту ошибку: enter image description here

РЕДАКТИРОВАТЬ

Это работает для меня:

SELECT `room_id`
FROM `room_type_day`
WHERE `date` IN ('2018-06-09', '2018-06-10', '2018-06-11')
GROUP BY `room_id`
HAVING COUNT(`room_id`) = 3;

Но как я могу изменить этот запрос, если одна или несколько комнат доступны, вернуть "да" иесли никого нет, вернуть «нет»?

Спасибо тебе

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

попробуйте так и убедитесь, что days_ = количество дней в вашем заявлении "IN"

    SELECT room_id, CASE WHEN days_=3 THEN 'yes' ELSE 'No' END) as availability
    FROM
    (
      SELECT rtd.room_id, Count(distinct rtd.room_id)  as days_
      FROM room_type_day as rtd
      WHERE rtd.date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', '2018-06-11 00:00:00')
      GROUP BY rtd.room_type_id
     ) as sub
0 голосов
/ 07 июня 2018

Используйте GROUP BY и HAVING предложение.

Запрос

SELECT `room_id`
FROM `room_type_day`
WHERE `date` IN ('2018-06-09', '2018-06-10', '2018-06-11')
GROUP BY `room_id`
HAVING COUNT(`room_id`) = 3;

Найти здесь SQL Fiddle

0 голосов
/ 07 июня 2018

Вы группируете по столбцу, который не найден в таблице.

SELECT 
   A.room_id, 
   IF(A.count=A.count_in_range,'Yes','No') status
FROM 
(SELECT 
   room_id, 
   COUNT(*) count, 
   SUM(IF(date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', 
                   '2018-06-11 00:00:00'),1,0)) count_in_range
FROM room_type_day
GROUP BY room_id) A;

См. Демонстрация по SQL Fiddle .

...