我将会话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.我无法弄清楚为什么这只发生在访客数量上。
很抱歉这个冗长的问题。任何想法都将不胜感激。
答案 0 :(得分:2)
由于您正在计算DISTINCT IP,因此当GROUP BY月份每个分组(月份)获得DISTINCT IP的计数时,即如果他们在多个月内访问,则可以多次计算。
例如:3月和4月12.123.456.78次访问,这是每个月计算的一个不同的IP,但如果没有按月分组,则只有1个不同的IP,您不能简单地添加分组COUNT的结果(DISTINCT)未分组时获得总COUNT(DISTINCT)。
此功能可能会有所帮助,因为它可以为重复访问者提供更多信息。