COUNT(DISTINCT X)MySQL Query不提供我需要的结果

时间:2011-09-30 14:08:45

标签: mysql count group-by distinct

在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,那么其他聚合查询的页面浏览量会少得多。

同样,我想要的是我上面提到的第一个查询,但是每个IPAddress只聚合一次,所以它基本上计算页面的唯一查看器,而不是页面的总浏览量。

我在做什么,或者没有正确地做出我想要的结果?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果你这样做:

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;