как вывести статистику

antis

Guest
как вывести статистику

Существуют статьи. Надо вывести список 10 самых популярных статей за, например, неделю. Самый простой вариант - обнулять кол-во посещений(хитов) с наступлением новой недели. Вопрос в следующем - можно ли выводить такой список так, чтобы не приходилось обнулять хиты?
Т.е. чел зашедший на страницу получил список 10 самых популярных статей за неделю назад, начиная с этого момента (или дня)(с момента когда он зашел)? Получается что нам как-бы надо отсечь все хиты более чем недельной давности, и показать только те, что свежие. Такое реально?
 

Profic

just Profic (PHP5 BetaTeam)
select * from table where year(now()) = year(datefield) AND week(now()) = week(datefield) limit 10

А доку прочитать очень реккомендую, тем более, что по муське есть и русская более менее толковая...
 

antis

Guest
спасибо, с такими запросами я не встречался, где можно найти доку с такими вот подробностями работы с mysql?

Но вы меня по-видимому не совсем верно поняли - надо чтобы выводились кол-во хитов именно за неделю - получается 10 популярных статей за неделю и их хиты именно за эту неделю и причем самых популярных именно по этим хитам за неделю ...
 

antis

Guest
да, но тогда придется обнулять эту таблицу каждую неделю - т.е. статистика с начала недели начинается с нуля - а этого не надо, надо чтобы статистика была всегда какбы постоянной
 

Yuriy_S

-=PHP-Club=-
TIMESTAMP
Создай в таблице поля, тип которого TIMESTAMP.
Я бы сказал как сделать с обычным временем, но тебе это будет сложно...
Что бы вывести за неделю, нужно от текущего времени отнять кол-во секунд, равное 1 неделе, и при выборе из БД проверять, не меньше ли кол-во секунд чем за 1 неделю (посчитанное выше).
Что бы вывести 10 хитов, нужно сделать в запросе лимит:
SELECT * FROM table_name WHERE ............ ORDER BY time DESC LIMIT 0, 10
Если что-то непонятно написал - пиши, подробно могу описать завтра утром, т.к сейчас я уже не в состоянии ;)
 

Yuriy_S

-=PHP-Club=-
ещё советую прочитать FAQ по функциям DATE_ADD (ADDDATE), DATE_SUB или SUBDATE в Русском мануале MySQL.
 

antis

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

вообще я без проблем могу достать за прошедшую неделю, и лимит, вся проблема как раз в том, что мне надо получить хиты за эту неделю, именно не все хиты - а только за неделю назад со дня когда юзер зашел на страницу

у меня есть поле datetime
 

Yuriy_S

-=PHP-Club=-
я тебе выше объяснил как это сделать.
Читай ман и все поймешь.
Будут вопросы - спрашивай, но пож-ста, постарайся понять сам.
 

Andrew_P

Guest
2antis, дай структуру таблицы где хрянятся хиты, я дам тебе нужный запрос. Вполне возможно, что у тебя структура под это не приспособлена. ;)
 

Falc

Новичок
2antis:
Тебе надо создать табличку где будут следующие данные:

Дата|кол-во хитов

Если будут вопросы как из нее выбрать кол-во хитов за определеный промежуток времени читай ман на MYSQl:
функции работы с датой http://www.mysql.com/doc/ru/Date_and_time_functions.html
функция sum() http://www.mysql.com/doc/ru/Group_by_functions.html
 

antis

Guest
Falc: да, насчет такой таблицы я догадался, но тогда на каждую статью надо сибо отдельную таблицу, либо отдельный столбец на каждую статью - но это многовато, кстати сколько возможно столбцов в таблице? сколько угодно как и записей?
а за ссылки спасибо

Andrew_P: структуры пока нет, за этим всем и спросил, ну примерно что-то типа на каждую статью есть посчитанные хиты и все

Yuriy_S: ок, щас еще раз попробую разобраться
 

Falc

Новичок
Originally posted by antis
Falc: да, насчет такой таблицы я догадался, но тогда на каждую статью надо сибо отдельную таблицу, либо отдельный столбец на каждую статью - но это многовато, кстати сколько возможно столбцов в таблице? сколько угодно как и записей?
а за ссылки спасибо
Зачем отдельные таблицы или поля.
Добавляем одно поле "код статьи"

Код статьи|Дата|кол-во хитов
 

Andrew_P

Guest
Структура:
[ЦВЕТОМ=teal]<дата>(key)|<код статьи>|<кол-во хитов>[/ЦВЕТОМ]

Запрос:
PHP:
select <код статьи>, SUM(<кол-во хитов>) as 'hits'
from <таблица хитов>
where
  year(now()) = year(<дата>)
  AND week(now()) = week(<дата>)
group by <код статьи>
order by hits desc
limit 10
"where <дата> >= now() - interval 30 day" - покажет за последние 30 дней.

И далее рули условиями "where" в заисимости за какой промежуток необходжимо получить данные.
 

antis

Guest
создал таблицу описанную выше, добавил в нее записи:
date | id | hits
-------------------------------------------
2003-08-12 02:07:15 | 1 | 12
2003-08-13 02:07:05 | 1 | 5
2003-08-12 02:07:07 | 2 | 9
2003-08-13 02:07:05 | 2 | 7

Запрос:

select id, SUM(hits) as 'hitss' from ... WHERE date >= now() - interval 30 day GROUP BY id ORDER BY hitss LIMIT 1 DESC

спасибо, все работает как надо

еще один маленький попутный вопросик - как выбрать самую новую статью?
мой запрос - SELECT *FROM ... ORDER BY date DESC LIMIT 0,1 - мне не очень нравится, можно ли это сделать как-нибудь с использованием max() - пока то что я пробовал у меня не получалось
 

Falc

Новичок
Originally posted by antis
создал таблицу описанную выше, добавил в нее записи:
date | id | hits
-------------------------------------------
2003-08-12 02:07:15 | 1 | 12
2003-08-13 02:07:05 | 1 | 5
2003-08-12 02:07:07 | 2 | 9
2003-08-13 02:07:05 | 2 | 7
Вот только время в нее не надо пихать.
 

Falc

Новичок
Originally posted by antis
еще один маленький попутный вопросик - как выбрать самую новую статью?
мой запрос - SELECT *FROM ... ORDER BY date DESC LIMIT 0,1 - мне не очень нравится, можно ли это сделать как-нибудь с использованием max() - пока то что я пробовал у меня не получалось
С мах() можно, но только в 2 запроса.
MYSQL 4.1 поддерживает подзапросы там можно через них.
Но вообще ORDER BY LIMIT 1 - работает достаточно быстро.
 

antis

Guest
понятно

>>> Вот только время в нее не надо пихать.

почему?
оно мне может пригодиться ...
 

Falc

Новичок
Originally posted by antis
>>> Вот только время в нее не надо пихать.

почему?
оно мне может пригодиться ...
Таблица сильно разбухнет и потом врядли тебе понадобяться посекундные хиты.
Если и стоит что-то хранить, то максимум часы.
 

Andrew_P

Guest
2Falc, не распухнет, т.к. это не зависит от того пишешь ли ты в поле "datetime" дату без времени или со временем, ведь тип данных один и место он занимает одно и тоже!
 
Сверху