Каков наилучший способ подсчета просмотров страниц в день в MySQL? - PullRequest
4 голосов
/ 02 ноября 2008

В моем блоге , в правой панели я отображаю 10 самых популярных статей с точки зрения посещений страниц. Вот как я это понимаю:

SELECT *
FROM entries
WHERE is_published = 1
ORDER BY hits DESC, created DESC
LIMIT 10

Я хотел бы показать топ-10 по количеству просмотров страниц в день. Я использую MySQL. Есть ли способ сделать это в базе данных?

Кстати, поле created - это дата и время.

ОБНОВЛЕНИЕ: Я думаю, что я не прояснил себя. Я хочу, чтобы запись блога с 10 000 посещений, которая была опубликована 1000 дней назад, имела такую ​​же популярность, как запись в блоге с 10 посещениями, которая была размещена 1 день назад. В псевдокоде:

ORDER BY hits / days since posting

... где hits - это просто целое число, которое увеличивается каждый раз при просмотре сообщения в блоге.

Хорошо, вот что я собираюсь использовать:

SELECT *, AVG(
    hits / DATEDIFF(NOW(), created)
) AS avg_hits
FROM entries
WHERE is_published = 1
GROUP BY id
ORDER BY avg_hits DESC, hits DESC, created DESC 
LIMIT 10

Спасибо, Стивен! (Мне нравится этот сайт ...)

Ответы [ 2 ]

6 голосов
/ 02 ноября 2008

Я не совсем уверен, что вы можете использовать структуру таблиц, которую вы предлагаете в своем запросе. Единственный способ, которым я могу придумать, - это получить топ-10 с помощью самых высоких средних хитов в день. При этом ваш запрос становится:

SELECT *, AVG(hits / DATEDIFF(NOW(), created)) as avg_hits
FROM entries
WHERE is_published = 1
GROUP BY id
ORDER BY avg_hits DESC
LIMIT 10

В этом запросе предполагается, что созданное вами поле имеет тип данных DATETIME (или аналогичный).

1 голос
/ 02 ноября 2008

Полагаю, у вас может быть столбец hit_day_count, который увеличивается при каждом просмотре, и hit_day_current.

На каждом просмотре страницы вы проверяете, является ли столбец hit_day_current сегодняшним днем. Если нет, сбросьте счетчик обращений. Затем вы увеличиваете столбец hit_day_count и устанавливаете для hit_day_current текущее время.

Псевдо-код:

if article_data['hits_day_current'] == datetime.now():
    article_data['hits_day_count'] ++
else:
    article_data['hits_day'] = 0

article_data['hits_day_current'] = datetime.now()

Очевидная проблема с этим проста - часовые пояса. Итоги сбрасываются в 00:00, где бы ни находился сервер, что может быть бесполезно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...