[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос с необычной группировкой данных
inpost
БД имеет структуру: `id`,`day`,`ip`. Есть интервал дней, запрос выглядит так:
    $res = mysqlQuery("SELECT COUNT(*) as `cnt`,`day` FROM `".IN_DBPREFIX."ip_move`
WHERE `day` >= '"
.$_POST['date_from']."'
AND `day` <= '"
.$_POST['date_to']."'
GROUP BY `day`
"
);

Сгруппировал по дням, получил количество уникальных записей за день. А как получить количество уникальных `ip` за день? Надо ведь их тоже сгруппировать по дням.
Мне надо получить: пятница, уникальных 7, суббота - 8, воскресенье - 9. При этом они могут повторяться каждый день.

Есть несколько глупых идей, например:
1) select count(distinct `ip`) - для каждого из дней. А если за 2 месяца - 60 запросов...
2) общую выборку сделать за этот период без группировки, далее сгруппировать полученный объем в многомерный массив, а его уже прогнать через array_unique (чтобы не было повторений по дата:ай-пи). Тут уже будет большой код по формированию...
3) есть вообще идея хранить всё в отдельной таблице, где крон будет раз в сутки формировать: (количество хостов и кликов за прошедший день).

Подскажите, пожалуйста, у меня просто нет идей как такое организовать правильно.

П.С. это ведение внутренней статистики. Верхний запрос считал количество кликов, а второй запрос, который не могу придумать - количество хостов.



Спустя 1 час, 50 минут, 52 секунды (27.02.2011 - 10:28) glock18 написал(а):
почему не добавить в этот же запрос count(distinct ip) ?

Спустя 1 час, 14 минут, 58 секунд (27.02.2011 - 11:43) Snus написал(а):
inpost
SELECT COUNT(`day`) AS `cnt`, `date`, `ip`
FROM `".IN_DBPREFIX."ip_move`
WHERE `day`
BETWEEN '".mysql_real_escape_string($_POST['date_from'])."' AND '".mysql_real_escape_string($_POST['date_to'])."'
GROUP BY `day`, `ip`
ORDER BY `day`, `ip`

Спустя 6 часов, 28 минут, 31 секунда (27.02.2011 - 18:12) inpost написал(а):
glock18
Потому что ip каждые сутки может повторяться. А я, как понимаю, будут вообще уникальные за весь период, а не по дням.

Snus
Спасибо, сейчас буду пробовать. А почему count(`day`), если надо количество `ip` в сутки?
Получить надо что-то типо:
понедельник - 7 уникальных `ip`,
вторник - 8 уникальных
среда - 9 уникальных.
При этом в каждый день `ip` могут повторяться.

Спустя 18 минут, 6 секунд (27.02.2011 - 18:30) Snus написал(а):
inpost
Цитата (inpost @ 27.02.2011 - 15:12)
Спасибо, сейчас буду пробовать. А почему count(`day`), если надо количество `ip` в сутки?

А это не имеет значения в данном запросе. Выдаст одно и то же кол-во )
Покажи результат. А то может еще додумать можно smile.gif

Спустя 8 часов, 38 минут, 38 секунд (28.02.2011 - 03:08) inpost написал(а):
Snus
Запрос классный, теперь можно следить сколько каждый ай-пишник шастал по сайту за день в целом, но результат снова не тот. Смотри что получилось:
cnt  day          ip  
5 2011-02-25 178.187.65.79
3 2011-02-27 46.98.69.19
2 2011-02-27 94.233.14.116
1 2011-02-28 178.187.65.79
3 2011-02-28 46.98.69.19
1 2011-02-28 94.233.14.116


То есть результат должен быть похожим, только суммировать количество выбранных записей:
1 2011-02-25 178.187.65.79
2 2011-02-27 94.233.14.116
3 2011-02-28 178.187.65.79


А в целом, всё решил, всем спасибо! =)
Я думал, что distinct `ip` будет в целом брать уникальные, а когда группируешь по дням, то уникальное берётся конкретно за день, вот запрос рабочий:

SELECT COUNT( DISTINCT `ip` ) 
FROM `amarket_ip_move`
WHERE `day` BETWEEN '2011-01-01' AND '2015-01-01'
GROUP BY `day


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.