Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Сколько сообщений я написал за последний месяц?


Автор: Muerto 5.9.2010, 16:24
Как это сделать эффективно?
Вариант с 30 полей, и подсчет суммы этих полей как то слишком сложно как мне кажется...
допустим если мы на 31ом дне то уже ячейки должны переписываться... но так ли это делают профи?

Как вариант экономии сразу думаю в сторону var_explode и сохранение значений через :
Но тогда гемор обновлять ...

А ведь такая задачка довольна таки распространенная в интернете в той или иной форме

Автор: bars80080 5.9.2010, 16:41
вообще-то, такая распространённая задача имеет два решения.
первый вариант, вообще ничего дополнительного не вводить. просто пройтись поиском по таблице сообщений и посчитать сколько сообщений было именно у тебя за последний месяц:

Код

SELECT count(*) FROM `posts` WHERE `id_user`=14 AND `date`<1234567890 AND `date`>1234567880


второй вариант - завести отдельную таблицу с полями id, id_user, date, добавлять туда запись при каждом новом сообщении, и провести затем тот же самый запрос, что выше
только зачем здесь вторая таблица?

Автор: Muerto 5.9.2010, 17:20
bars80080, Спасибо, отличные решения!

Автор: sergejzr 5.9.2010, 17:46
Muerto, не забудьте индекс на "date" поставить.

Автор: Muerto 5.9.2010, 18:08
Один только недостаток я вижу с точки зрения оптимизации

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



Автор: ksnk 5.9.2010, 18:39
Код

SELECT count(*) FROM `posts` WHERE `id_user`=14  and DATE_SUB(CURDATE(),INTERVAL 31 DAY)<=`date`
AND month(`date`)=month(CURDATE())


что-то вроде этого. 
1-го числа, вроде как, надо начинать новую статистику.
В принципе - можно поптимизировать, но imho, mysql и так умный...

Автор: sergejzr 5.9.2010, 21:04
Цитата(Muerto @  5.9.2010,  17:08 Найти цитируемый пост)
Один только недостаток я вижу с точки зрения оптимизации

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


Код

SELECT id_user,count(*) as cnt FROM `posts` WHERE DATE_SUB(CURDATE(),INTERVAL 31 DAY)<=`date`
AND month(`date`)=month(CURDATE()) GROUP BY id_user ORDER BY cnt DESC


Выдаст список юзеров и количества сообщений за посл. месяц, сортированный по количеству сообщений.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)