Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Построение статистики по месяцам, неделям и дням из данных БД
 
 автор: DDK   (01.12.2011 в 18:19)   письмо автору
 
 

Приветствую!

Есть БД, в ней куча данных, каждая запись имеет поле с датой, хранящейся в формате UNIX-time. Надо выводить статистику в виде графика. График на HTML5 нашёл удобный, строится автоматически на основе таблицы. Вопрос в другом: как лучше организовать выборку информации из базы по датам, группируя её по указанному периоду (по месяцам, неделям, дням). Интересна больше логика, но и конкретному примеру буду рад :)

Вот, допустим, есть у вас таблица заказов, у каждого заказа прописана дата. Как построить график статистики поступления заказов по месяцам, неделям или даже дням? :)

Сейчас я делаю массив, содержащий информацию о начале и конце месяца/недели/дня (в unix-time) и делаю много запросов. Т.е. если в году у нас 54 недели - будет 54 идентичных запроса, отличающихся только временными метками, передаваемыми оператору BETWEEN. Если в году 365 дней - значит 365 запросов... но это же сумасшествие! С индексацией, конечно, нормально... но всё равно это бред какой-то получается :))

P.S. При особой необходимости могу перевести хранение даты в формат SQL DATE.

Спасибо!

  Ответить  
 
 автор: cheops   (01.12.2011 в 18:38)   письмо автору
 
   для: DDK   (01.12.2011 в 18:19)
 

1. Проще всего при помощи FROM_UNIXTIME() и DATE_FORMAT() сформировать вычисляемый столбец в удобной вам форме, например, только года или год и месяц или год и неделя и группировать таблицу по этому полю.
2. Еще один подход заключается в объединении таблицы с заранее созданной таблицей временных интервалов, т.е. 365 дней выливаются в таблицу с 365 записями, с которой вы объединяете свою таблицу.

  Ответить  
 
 автор: DDK   (01.12.2011 в 19:01)   письмо автору
 
   для: cheops   (01.12.2011 в 18:38)
 

Спасибо, cheops!

Да, когда я начал копать эту тему, понял, что она скорее к разделу SQL относится :)

Вот такой запрос у меня получился, дальше уже понятно, как делать другие комбинации:


SELECT FROM_UNIXTIME(  `r_date_sold` ) AS human_date, DAYOFMONTH( FROM_UNIXTIME(  `r_date_sold` ) ) AS month_number, COUNT( * ) 
FROM reports
WHERE MONTH( FROM_UNIXTIME(  `r_date_sold` ) ) =11
GROUP BY DAYOFMONTH( FROM_UNIXTIME(  `r_date_sold` ) ) 
LIMIT 0 , 30



С вспомогательной таблицей идея хорошая, так как если просто испоьзовать вышеприведённый метод, то выпадают дни с нулевым количеством строк. Т.е. выводятся только те дни, которым соответствует хотя бы одна запись.

Но как быть с високосными годами и прочими ньюансами календаря в случае с вспомогательной таблицей?

  Ответить  
 
 автор: cheops   (01.12.2011 в 19:15)   письмо автору
 
   для: DDK   (01.12.2011 в 19:01)
 

Как вариант, можно предварительно временную таблицу создавать или таблицу типа MEMORY.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования