mysql - поиск между датами, где появляются все даты - PullRequest
3 голосов
/ 28 января 2010

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

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

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

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

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

будет недостаточно, поскольку это вернет все комнаты, доступные в НЕКОТОРЫХ точках между выбранными датами, а не комнаты, которые доступны для ВСЕХ указанных дат.

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

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

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 28 января 2010

Обновление: мой оригинальный ответ был идентичен ответу Кассного, но на 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
3 голосов
/ 28 января 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...