我将各个网站访问的会话 ID、IP 地址和时间戳以及所有相关的综合浏览量存储在数据库中。它包含更多数据,但此处相关的数据是通过以下查询提取的:
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。我无法弄清楚为什么这只发生在访问者人数上。
很抱歉这个冗长的问题。任何想法将不胜感激。