2011-09-30 87 views
2

在MySQL中,我有一個查詢來計算我想要聚合的page_views表中的所有瀏覽器。這裏是我的查詢:COUNT(DISTINCT X)MySQL Query沒有給出我需要的結果

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地址,以便刪除多次查看該頁面的用戶。我在COUNT添加DISTINCT所以它看起來是這樣的:

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只聚合一次,因此它基本上計算頁面的唯一查看者,而不是頁面的查看總數。

我在做什麼,或不正確地獲得我想要的結果?

謝謝。

+0

是否'IPAddress'包含NULL值? –

+0

@a_horse_with_no_name第 – user973195

+1

這意味着相同的用戶使用不同的瀏覽器訪問該頁面,這是一個問題嗎? –

回答

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;