Календарь событий php — выборка из базы?

Здравствуйте.
Нужно реализовать календарь событий. Суть заключается в том, чтобы подсветить событие ссылкой на определенном дне месяца, если такое число лежит в диапазоне.

MYSQL
id start_date end_date
1 2014-05-06 2014-05-08
2 2014-02-06 2014-09-08
3 2014-04-12 2014-04-01
4 2014-05-01 2014-05-03
5 2014-09-06 2014-09-11
6 2014-05-06 2014-05-25
.......

Я нашел такое решение: сделать цикл от 1 до 31 ($mydate), то есть пройтись по всем дням месяца и сделать приблизительно такую выборку:
SELECT id FROM dates WHERE '$mydate' BETWEEN start_date AND end_date LIMIT 1;

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

Но мне кажется, что каждые раз пробегаться циклом и делать 30 выборок нецелесообразно. Кроме того, в базе может находится несколько тысяч значений. Подозреваю, что это займет много времени.

Как можно проще реализовать данную задачу?
  • Вопрос задан
  • 6122 просмотра
Решения вопроса 2
@Yago
Используйте timestamp в полях даты
www.unixtimestamp.com/index.php

Дополню мысль:

вы выбираете все записи диапазона. При формировании календаря циклом формируете дни. При формировании дней проверяете в записях диапазона наличие событий на текущую дату. Все значения даты легче перевести в timestamp для удобной работы с диапазонами.
Ответ написан
Комментировать
bohdaniel
@bohdaniel Автор вопроса
то есть, все равно придется, пробегая циклом по всем дням месяца, обращаться каждый раз к базе и смотреть есть ли события для определенной даты? Одним запросом нельзя ли это сделать? Дело в том, что события имеют начало и конец. Например, премьера фильма начинается 15.05.2014, а заканчивается показ 15.09.2014. Я формирую календарь на 6 месяц 2014 года. Тогда все дни должны будут быть подсвечены ссылкой (так как для каждого дня есть событие). Вот другой пример, есть выставка, которая длиться 2 дня - с 15.05.2014 по 16.05.2014, тогда будут подсвечиваться только 2 дня - 16 и 17.
думаю, я понятно изложил суть проблемы...

Кажется, нашел элегантное и простое решение проблемы:
SELECT id FROM events WHERE start_date <= 2014-05-31 AND end_date >= 2014-05-01;
где 2014-05-31 и 2014-05-01 - последняя и первая даты календаря выбранного месяца и года

Этим запросом выберутся все события, которые проходят через выбранный месяц
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nazarpc
@nazarpc
Open Source enthusiast
Можно использовать денормализацию БД, добавить колонки с днем, месяцем и фильтровать по ним если нужно. Если у этих колонок будет индекс - работать должно шустро.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы