SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.01.2012 18:00:47

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Календарь и события, как лучше?

Привет, друзья, всех с празниками )

Есть вроде простая задачка, но интересно как ее решить наиболее красиво smile

Дано
таблица с полем datetime и еще кучкой полей, суть которых вообще не важна
В эту таблицу попадают некоторые события, количество произвольное, одно событие - одна запись.

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

Самый очевидный способ (условный запрос)

SELECT datetime, COUNT(*) AS cnt FROM tbl WHERE datetime BETWEEN {%to} AND {%to} GROUP BY DATE(datetime)

результат правильный, но поскольку в какие то дни событий могло не быть - получатся дырки.
А хочется итогом получить сразу полную таблицу, например за январь, в которой будет 31 запись и там где событий не было чтобы cnt = 0, там где были - их количество

Варианты, которые мне пришли в голову:
1. пробежать скриптом от 1-го до 31 января и сделать 31 запрос. Даже комментировать не буду smile)
2. Получить таблицу выше, потом пробежать скриптом от 1 до 31 и дополнить таблицу отсутствующими датами.
3. Сначала сделать CREATE TEMPORARY TABLE  в которую вставить 31 запись с датами, после чего LEFT JOIN ее к основной
4. Еще мне предлагали по крону вставлять в полночь одну запись пустую, но это тоже не вариант.

Как покрасивее решить? smile

Неактивен

 

#2 14.01.2012 03:10:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Календарь и события, как лучше?

Покрасивее — не заставлять базу делать несвойственные вещи (например,
форматировать красиво таблички). Задача базы данных — добыть данные.
Задача Вашей программы — взять данные из базы и красиво показать. Нолики
по смыслу должна добавлять Ваша программа, а не база. Можно, конечно,
попытаться написать программу в рамках SQL, но, вообще говоря, это костыль smile

Неактивен

 

#3 16.01.2012 12:45:06

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Календарь и события, как лучше?

Эмм... Паша, я же не прошу SQL форматировать мне данные. Я прошу мне их дать. Вообще это типичный LEFT JOIN, вот только джойнить мне нечего. Еще например задача - дать мне дни в диапазоне, в которых событий не было. (т.е. это аналог LEFT JOIN ... WHERE ... IS NULL)

Что мне для этого надо сделать? Запросить  дни в которых события были (совершенно замечу напрасно), а потом уже скриптом фильтровать?

По моему это задача БД, а не скрипта, разве я не прав?

Я просто задумался, может в SQL можно как то генерировать последовательности(таблицы) на лету?

Неактивен

 

#4 16.01.2012 16:28:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Календарь и события, как лучше?

Именно просишь smile Ты просишь базу выдать тебе то, чего в ней нет. Это для
базы неестественно. Можешь сделать временную табличку с допустимыми
значениями поля или делать подзапросами. И то, и другое — костыль в своем
роде.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson