mysql - поиск по датам, где отображаются все даты

Я работаю с некоторыми импортированными данными, в которых хранится информация о том, доступна ли «комната» в определенный день или нет. Каждый номер имеет индивидуальную запись на дату, когда он свободен.

| id  |  date        |  price  |
--------------------------------
|  1  |  2010-08-04  |  45.00  |

Пользователь может выполнять поиск в диапазоне дат, и поиск должен возвращать соответствующие комнаты, доступные между этими двумя датами.

Другими словами, используя sql-запрос для поиска:

where date>=2010-08-04 AND date<=2010-08-09

будет недостаточно, так как это вернет все номера, доступные в НЕКОТОРЫЙ момент между выбранными датами, а не номера, доступные на ВСЕ соответствующие даты.

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

Платформой конечного кода является PHP, и я также изучаю, можно ли впоследствии обрабатывать данные в коде, но хотел бы сохранить все с помощью sql, если это возможно.

Любые выдвинутые предложения будут с благодарностью приняты.

Спасибо


person simnom    schedule 28.01.2010    source источник
comment
Как называется стол?   -  person Mark Byers    schedule 28.01.2010


Ответы (2)


Обновление: мой первоначальный ответ был идентичен ответу Quassnoi, но опоздал на 1 минуту, поэтому я решил удалить его и вместо этого сделать что-то другое. Этот запрос не предполагает уникальности (id, date). Если записей несколько, выбирается самая дешевая. Кроме того, он также суммирует общую стоимость и возвращает ее, что также может быть полезно.

SELECT id, SUM(price) FROM (
    SELECT id, date, MIN(price) AS price
    FROM Table1
    GROUP BY id, date) AS T1
WHERE `date` BETWEEN '2010-08-05' AND '2010-08-07'
GROUP BY id
HAVING COUNT(*) = DATEDIFF('2010-08-07','2010-08-05') + 1
person Mark Byers    schedule 28.01.2010
comment
Извините, это то же самое, что и у Quassnoi - я не видел, чтобы он уже опубликовал. - person Mark Byers; 28.01.2010
comment
Теперь я изменил свой ответ, так что это не просто дубликат ответа Quassnoi. - person Mark Byers; 28.01.2010
comment
+1. Включение предложения WHERE в подзапрос сделает его быстрее. - person Quassnoi; 28.01.2010

При условии, что (id, date) комбинация уникальна:

SELECT  id
FROM    mytable
WHERE   date BETWEEN '2010-08-04' AND '2010-08-09'
GROUP BY
        id
HAVING  COUNT(*) = DATEDIFF('2010-08-09', '2010-08-04') + 1

Убедитесь, что у вас есть ограничение UNIQUE для (id, date), а date хранится как DATE, а не DATETIME.

person Quassnoi    schedule 28.01.2010