Союз всех, где пункт даты

Мой запрос

SELECT RoomType, date FROM Superior WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
UNION
SELECT RoomType, date FROM Deluxe WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
UNION
SELECT RoomType, date FROM SuperDeluxe WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
ORDER BY date
HAVING COUNT(date, INTERVAL 3 DAY) 

Получение синтаксической ошибки рядом с 'HAVING COUNT(date, INTERVAL 3 DAY)

Моя цель - получить результаты для типа номера с датами и наличием более 3 дней.

** В таблице для Superior и Deluxe на дату 2012-06-29 Avail=0, для SuperDeluxe все даты доступны

В этом случае мой результат должен отображать только SuperDeluxe как доступность, но

**RoomType**    **date**
Superior        2012-06-26
Superior        2012-06-27
Superior        2012-06-28
Deluxe          2012-06-26
Deluxe          2012-06-27
Deluxe          2012-06-28
SuperDeluxe     2012-06-26
SuperDeluxe     2012-06-27
SuperDeluxe     2012-06-28
SuperDeluxe     2012-06-29

Да, это MySQL, я просто пытаюсь доказать себе, что могу сделать это, помогая моему дяде. Как вы знаете, я не сезонник, а только новичок. Вы правильно догадались, все 3 таблицы неоднозначны. У меня есть еще одно поле Avail, в котором отслеживается количество свободных номеров. Когда бронирование завершено, он автоматически рассчитывает доступные номера.

Мои текущие запросы используют выбор варианта типа комнаты, который может генерировать доступность только для типа комнаты для каждого запроса. С учетом вышеизложенного я планировал получить 1 запрос и сгенерировать любой тип комнаты, доступный в диапазоне дат. Проблема, с которой я сталкиваюсь, когда использую приведенный выше запрос на объединение, результат, который я получаю, также включает одну из дат в диапазоне, в котором доступность = 0

Я пытался что-то вроде этого

SELECT RoomType, COUNT( date )
FROM Superior
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
UNION
SELECT RoomType, COUNT( date )
FROM Deluxe
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
UNION
SELECT RoomType, COUNT( date )
FROM SuperDeluxe
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
GROUP BY date
HAVING COUNT( 4 )

Кажется, я приближаюсь. Я попробовал MAX (дата), он дает дату с 4 строками, но по-прежнему отображает 1 строку типа комнаты, для которой доступно> 0

Я также пробовал HAVING COUNT (DISTINCT date) = 4 Результаты по-прежнему отображают дату поля со строками, не равными 4


person user1478893    schedule 29.06.2012    source источник
comment
Какой продукт базы данных вы используете? MySQL? Кроме того, это пахнет разделением атрибутов - почему 3, казалось бы, одинаковых таблицы? Почему бы не просто 1 стол с дополнительным столбцом, указывающим Superior, Deluxe или SuperDeluxe?   -  person Damien_The_Unbeliever    schedule 29.06.2012
comment
Покажите нам определение таблицы и примеры данных. Что такое Availability, флаг 0 или 1? Это целое число, описывающее доступные дни?   -  person ypercubeᵀᴹ    schedule 29.06.2012
comment
Поскольку у вас есть предложение where в каждом из ваших 3 вариантов, просто удалите оператор HAVING.   -  person Kane    schedule 29.06.2012


Ответы (1)


HAVING работает только с GROUP BY (для фильтрации групп), но у вас нет групп в игре.

Вам нужно простое предложение WHERE в каждом выборе, а выбор-оболочка вы можете заказать:

select * from (
    SELECT RoomType, date 
    FROM Superior
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
  UNION
    SELECT RoomType, date
    FROM Deluxe
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
  UNION
    SELECT RoomType, date
    FROM SuperDeluxe
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
) results
ORDER BY date

Я бы серьезно подумал об объединении данных в одну таблицу и добавлении столбца, чтобы различать три типа бронирования, вместо того, чтобы иметь больше таблиц. Это не только сделает ваши запросы разумными, но и когда вы получите новый тип бронирования, вам не нужно создавать еще одну таблицу.

person Bohemian♦    schedule 29.06.2012
comment
Не уверен, что это решит проблему, поскольку спецификации довольно расплывчаты, но, похоже, в правильном направлении. Однако вам не нужно оборачивать этот запрос во вложенный подзапрос. - person ypercubeᵀᴹ; 29.06.2012