COUNT (DISTINCT X) MySQL Query не дает нужных мне результатов - PullRequest
2 голосов
/ 30 сентября 2011

В MySQL у меня есть запрос для подсчета всех браузеров из таблицы page_views, которую я хочу объединить.Вот мой запрос:

SELECT
    Browser,
    COUNT(*)
FROM page_views
WHERE PageID = 58
GROUP BY Browser;

, который дает, например:

Chrome            14
Firefox           17
Internet Explorer 9
Opera             5
Safari            3
--------------------
Total             48

Это именно то, что я хочу.Работает нормально и быстро.Теперь я хотел бы по отдельному IP-адресу удалить пользователей, которые просматривали страницу более одного раза.Я добавил DISTINCT в COUNT, чтобы это выглядело так:

SELECT
    Browser,
    COUNT(DISTINCT IPAddress)
FROM page_views
WHERE PageID = 58
GROUP BY Browser;

Похоже, это работает, но на самом деле я не думаю, что это работает.В моей реальной среде я делаю агрегаты по нескольким столбцам, один для браузера, для дня недели, один для месяца и т. Д., Так что это один запрос каждый, но с разными GROUP BY.Как я заметил, это может быть не тот результат, которого я хочу, так это то, что каждый из моих запросов имеет разное число для итогов.Агрегирование просмотров по браузерам дает 48 просмотров, по дням недели 45 просмотров, по месяцам 50 просмотров.Что-то не так.

Кроме того, если я сделаю простое SELECT COUNT(DISTINCT IPAddress) FROM page_views WHERE PageID = 58, я получу гораздо меньше просмотров страниц, чем другие агрегатные запросы в целом.

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

Что я делаю или неправильно делаю, чтобы получить результатыХочу?

Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2011

Если вы делаете:

SELECT
    Browser,
    day_of_the_week,
    month_of_the_year,
    COUNT(DISTINCT IPAddress)
FROM page_views
WHERE PageID = 58
GROUP BY Browser, day_of_the_week,month_of_the_year

Итого count(distinct) не будет таким же, как в вашем простом запросе.

Если вы хотите удалить дубликаты IP-адресов в один и тот же день, вам понадобится что-то вроде этого:

SELECT 
  p1.Browser
  , p1.pageID
  , p1.WEEKDAY(`date`) as day_of_week
  , p1.MONTH(`date`) as The_month
  , COUNT(p2.Unique_visitors_this_day) as uniqueviews
FROM page_views p1
LEFT JOIN (SELECT id, 1 as Unique_visitors_this_day FROM page_views pv1
           LEFT JOIN page_views pv2 ON (pv1.id > pv2.id 
                                     AND pv1.ipaddress = pv2.ipaddress
                                     AND pv1.`date` = pv2.`date`)
           WHERE pv2.id IS NULL) as p2
       ON (p1.id = p2.id)
 WHERE p1.PageID = 58
 GROUP BY p1.Browser, p1.day_of_week, p1.The_month;
...