Статистика, "Размер аудитории"

JonnyB

Новичок
Статистика, "Размер аудитории"

Пишу кусок статистики, а именно часть, отвечающую за вывод размера аудитории сайта.

Допустим будет 3 типа посетителей:
- Постоянные (Те кто заходят на сайт не менее 1 раза в два дня)
- Ядро (Те кто бывает на сайте 1 раз в неделю)
- Новые (Те кто заходят хотя бы раз в месяц)

В статистике должна быть возможность задать диапазон дат для вывода количества посетителей, например

с 2010-03-10 по 2010-04-05

Постоянные - 10
Новые - 40
Ядро - 20
Для хранения и последующей выборки этой информации создал таблицу:

PHP:
CREATE TABLE IF NOT EXISTS `s_audience` (
  `id` int(14) unsigned NOT NULL auto_increment,
  `session_name` varchar(50) NOT NULL,
  `date` date NOT NULL,
  `siteid` int(12) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `UNIQUE` (`session_name`,`date`,`siteid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
Но что то мне подсказывает что структура записей не верная, т.к. извлечь количество посетителей по нужным критериям мне не удается. Подскажите пожалуйста запрос или другую реализациею для выполнения данной задачи.
Спасибо
 

dimagolov

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

п.с. сессия тут не при чем вообще
 

JonnyB

Новичок
dimagolov, есть уникальная сессия,
ini_set('session.cookie_lifetime', 60 * 60 * 24 * 30 * 6);

Идентификатор записываю в таблицу. За 1 день в таблицу добавится не более 1 записи с одинаковым именем сессии и id сайта.
 

JonnyB

Новичок
dimagolov

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

Вопрос к сожалению не об этом :(
 

dimagolov

Новичок
JonnyB, если ты используешь сессии не по назначению и не хочешь слушать советы, то для чего ты тут что-то спрашиваешь?

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

кстати, а что по-твоему "заход на сайт"? как ты определяешь это?
 

JonnyB

Новичок
dimagolov

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

По поводу времени куков я писал - ini_set('session.cookie_lifetime', 60 * 60 * 24 * 30 * 6); она отлично устанавливается на полгода :)

siteid - идентификатор сайта, связан с другой таблицей, ид-имя_сайта (статистика не для одного сайта ведется, а скрипт один). Скрипт, добавляющий запись в таблицу вызывается с другого сайта через <script src=" ... .php">, там же проверяется если записи текущего пользователя на текущем сайте за текущую дату не найдена - она добавляется.
 

dimagolov

Новичок
вызывается с другого сайта через <script src=" ... .php">
дык, с этого и надо было начинать :) почему из тебя нужно вытягивать клещами информацию? дело в том, что браузеры кешируют как картинки, так и скрипты и стили, поэтому и не дергают для одного и того же юзера твой скрипт слишком часто.
кроме того, я вообще не уверен будут или нет в таком случае посылаться и ставиться куки, это нужно проверять по месту, уж больно место вызова хитрое.

чтобы не кешировали, то нужно добавлять уникальный параметр в линк, но тогда у тебя появиться другая проблема, потому что ты не ответил на ключевой запрос:
а что по-твоему "заход на сайт"?
-~{}~ 19.04.10 16:43:

п.с. проверил, куки посылаться/ставиться должны.
 

JonnyB

Новичок
Браузер скрипт цепляет, с кешированием я справился, куки ставятся.

Заход на сайт - посещения пользователем одной из страниц сайта.

А какая проблема у меня еще появится?
 

dimagolov

Новичок
то есть каждое обновление страницы это заход?

у тебя оцениваются периоды в "днях". "день" это сутки в time zone сервера или это 24 часа с последнего посещения? если я загрузил первую страницу в 23:59, а вторую в 0:01, то это я заходил один раз, или два? и один раз в 2 дня или 2?
 

JonnyB

Новичок
то есть каждое обновление страницы это заход?
ага

у тебя оцениваются периоды в "днях". "день" это сутки в time zone сервера или это 24 часа с последнего посещения? если я загрузил первую страницу в 23:59, а вторую в 0:01, то это я заходил один раз, или два? и один раз в 2 дня или 2?
2 раза в два дня, сохраняется дата, это упростит выборку думаю, а на статистику повлияет копеечно
 

dimagolov

Новичок
вот если бы у тебя были вменяемые сессии, то можно было бы считать заходом созданием новой сессии для того же User_Id. но ты сам себе создаешь геморрой, с которым будешь героически бороться. к примеру, у тебя будут пол-года храниться дохлые и никому не нужные сессии на диске...
 

JonnyB

Новичок
А в вашем варианте как осуществить выборку нужных данных из заполненной таблицы?
 

dimagolov

Новичок
да так же, как и в твоем. только юзать уникальный User_Id, который кидай в куку на год скажем, вместо session_id

сделай триггер on insert и в нем отбирай когда были последние заходы у этого юзера и соответственно добавляй сайт-тип-дата обновления в еще одну таблицу. вот ее нужно по крону чистить (для разных типов с разной периодичностью) и уже по ней делать count для статистики.
 

JonnyB

Новичок
У меня проблема как раз в count... Имеено в том, каким образом выбрать вот это:


с 2010-03-10 по 2010-04-05

Постоянные - 10
Новые - 40
Ядро - 20
ТО есть сам синтаксис то я знаю, но как в зависимости от входных данных:

- Постоянные (Те кто заходят на сайт не менее 1 раза в два дня)
- Ядро (Те кто бывает на сайте 1 раз в неделю)
- Новые (Те кто заходят хотя бы раз в месяц)
сделать выборку - я не соображу. Подскажите алгоритм пожалуйста...
 

dimagolov

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

JonnyB

Новичок
dimagolov, А как в той второй таблице делать выборку за период (ведь пользователь со временем может переходить из "группы" в группу.. И при этом нужно учитывать не только последний заход, а где то за 2 предшедствущих дня, за неделю, месяц и т.д в зависимости от нужного диапазона дат)? Какая у нее должна быть структура? Я что то не прикину, завтра перечитаю переписку, может что то упустил...
 

dimagolov

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

итого. У тебя "новые" будут включать "ядро" и "постоянных", но не всегда, потому что если чел всю следующую неделю будет ходить каждый день, то будет попадать только в "Постоянные". кроме того по логике, кол-во постоянных при таком раскладе будет удваиваться (кроме тех кто первый раз попал в постоянные).

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

-~{}~ 19.04.10 18:40:

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

-~{}~ 19.04.10 18:47:

в теории можно запрашивать в триггере лог не только о предыдущем посещении, но о всех посещениях за месяц и неделю. но фишка в том, что надо связывать новую запись в агрегирующей таблице с записью в логе (получать id в логе и вставлять в еще одно поле в таблице `s_audience`), чтобы чистить именно нужную запись из агрегирующей при вставке в лог и изменении категории / обновлении присутствия в "постоянных"
 

Mols

Новичок
Эм... может стоит разделить записи для каждого входа и данные для этого "Размера аудитории"?
Навскидку так.
user_id
site_id
prev_visit_time
last_visit_time

При каждом входе пользюка обновляем prev_visit_time, last_visit_time. Обновляем в том случае если last_visit_time был к примеру 5(10, 20...) часов назад(для того, чтобы всё-таки не считать открытие 2х и более страниц подряд разными визитами). Ну и выборка вроде понятна.
Выбираем всех у кого last_visit_time меньше чем месяц + группируем по условию last_visit_time - prev_visit_time применительно к требуемым "неделя" "два дня" "месяц".
Собсно всё.
А все визиты по страницам тупо отдельно хранить... если надо

-~{}~ 01.05.10 14:03:

Сорри. Не глянул на даты постов.
 
Сверху