2013-06-20 44 views
1

我在數據庫中存儲了單個網站訪問的會話ID,IP地址和時間戳以及所有關聯的綜合瀏覽量。它包含更多的數據,但與此相關的數據與此查詢提取:GROUP BY DAY(FROM_UNIXTIME)意外更改計數

SELECT 
Pageviews.id, Visitors.time, Visitors.session, Visitors.ip 
FROM Visitors 
INNER JOIN Pageviews 
    ON Visitors.session=Pageviews.session 
ORDER BY Visitors.time ASC 

導致這樣的事情:

id  time  session      ip 

1048 1371473496 nhie5sh2tiufs2ufupcremc6c2 x88.xxx.xxx.xxx 
1050 1371474103 8hfphqvq5ri6muc84oidp7q195 x6x.xxx.xxx.xxx 
1062 1371474956 hhgssr4v26pjbilkg8d81olqj7 xxx.x3x.xxx.xxx 
1066 1371476339 ic8iqd0a4mpoelni15n4tq3404 x1x.xxx.xxx.xxx 
1067 1371476629 ockivrm61upk7ss5ni4n8muv23 x2x.xxx.xxx.xxx 
1070 1371477856 5tdj9rrd1qsvafovufnkgh8r26 xxx.xxx.x7x.xxx 
1068 1371477856 5tdj9rrd1qsvafovufnkgh8r26 xxx.xxx.xxx.x2x 
1069 1371478229 5e82v29nuf2k46ir13i21msps5 xxx.x5x.xxx.x8x 

讓遊客總數(不同IP地址),訪問(不同的會話)和瀏覽量(瀏覽量不同的ID),我查詢數據庫,如下所示:

SELECT 
count(distinct(Visitors.ip)) as 'Visitors', 
count(distinct(Visitors.session)) as 'Visits', 
count(Pageviews.id) as 'Pageviews' 
FROM Visitors 
INNER JOIN Pageviews 
ON Visitors.session=Pageviews.session 

它返回類似下面:

Visitors Visits Pageviews 

211  244  412 

但是,我想使用存儲的時間戳按年,月和日對這些總數進行分組。爲了獲得這些數據,我寫了下面的查詢:

SELECT 
DAY(FROM_UNIXTIME(Visitors.time)) as 'Day', 
MONTH(FROM_UNIXTIME(Visitors.time)) as 'Month', 
YEAR(FROM_UNIXTIME(Visitors.time)) as 'Year', 
count(distinct(Visitors.ip)) as 'Visitors', 
count(distinct(Visitors.session)) as 'Visits', 
count(Pageviews.id) as 'Pageviews' 
FROM Visitors 
INNER JOIN Pageviews 
ON Visitors.session=Pageviews.session 
GROUP BY Year, Month, Day 
ORDER BY Year, Month, Day DESC 

這工作得相當好,在該日期,瀏覽量和訪問是正確的:

Day Month Year Visitors Visits Pageviews 

20 6  2013 40   43  59 
19 6  2013 80   90  112 
18 6  2013 62   66  173 
17 6  2013 43   45  68 

正如你所看到的,瀏覽量在此處添加到412以上,以及訪問上述244.然而,晚上讓我感到不安的是,遊客數量不應該累加到211,因爲它應該,但是到225.我不明白爲什麼這隻發生在遊客數量上。

對不起,冗長的問題。任何想法將不勝感激。

+1

只是一個側面說明:'distinct'是**不是**的功能。寫'distinct(foo)'與'distinct foo'相同。這些神經質完全沒有用處,並且經常暗示(特別是當與多列一起使用時)「distinct」的行爲被誤解了。 –

+0

很高興知道,謝謝。 – redburn

回答

2

由於您計算的是DISTINCT IP,因此如果GROUP BY月份中的每個分組(月份)都計算了DISTINCT IP,即如果他們在多個月內訪問,則可以計數多次。

例如:3月和4月訪問12.123.456.78,這是一個不同的IP在每個月計算,但只有1個不同的IP,如果不按月分組,則不能簡單地添加分組計數的結果(DISTINCT )在未分組時獲得總COUNT(DISTINCT)。

此功能可以幫助您瞭解重複訪客與新訪客。

+0

啊,當然!在進一步閱讀中,這顯然被稱爲「酒店問題」。 – redburn