mysql: выборка дней по порядку

Необходимо реализовать календарь событий, а именно:

пользователь указав 1.01.11 стартовым значением поиска и 1.02.11 конечным получил бы списком

1.01.11 — 2 мероприятия
2.01.11 — 3 мероприятия
3.01.11 — 2 мероприятия
4.01.11 — 2 мероприятия
5.01.1 1- 2 мероприятия

31.01.11 — 2 мероприятия
1.02.11 — 2 мероприятия

возможно реализовать выборку дней при помощи sql команды? И если нет, то нужно перебирать значение циклом?
  • Вопрос задан
  • 4629 просмотров
Пригласить эксперта
Ответы на вопрос 5
@VeMax
SELECT DATE(`date`), count(`id`) FROM `test` WHERE `date` BETWEEN '2011-12-01 00:00:00' AND '2011-12-02 23:59:59' GROUP BY DAY(`date`)
Где поле date — datetime
Ответ написан
@VeMax
И в данном случае требуется вывести, например 2.01 что есть одна выставка?
Ответ написан
@MikhailEdoshin
Мне кажется, тут не обойтись без таблицы дней в каком-то виде. Хотя бы как таблицы дней, привязанной к таблице событий — при создании события во вспомогательной таблице создавалось бы нужное число записей для диапазона дат. Но чтобы заполнять такую таблицу все равно потребуется хотя бы массив чисел от 1 до максимального количества дней в событии.

В SQLite можно создавать виртуальные таблицы — там, наверное. можно и генерировать даты по запросу. MySQL не знаю — может быть там есть какие-то процедуры, которые могут возвращать выборку? Или, например, создать view из 31 дня, из 12 месяцев и из нужного числа лет, и, соединяя их в нужных комбинациях, генерировать таблицу дней.
Ответ написан
Комментировать
@rPman
фиктивные таблицы:
select 1 from dual union
select 2 from dual union


комбинируя разные такие таблицы, можно много что наворотить… только остается вопрос эффективности, но вдруг это решение будет эффективнее создания специальной таблицы.
Ответ написан
Комментировать
taliban
@taliban
php программист
Еще как вариант:

SELECT dates.begin, count( events.id )
SELECT `events` as `dates`
LEFT JOIN `events` as `events` on ( dates.begin <= events.begin 
                                   AND dates.end >= events.end )
GROUP BY dates.begin

Как-то так…
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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