mysql - GROUP BY DAY(FROM_UNIXTIME) 意外更改计数

标签 mysql sql

我将个人网站访问的 session 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)、访问次数(不同的 session )和页面浏览量(不同的页面浏览 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。我不明白为什么只对访问者计数发生这种情况。

抱歉这个冗长的问题。任何想法将不胜感激。

最佳答案

由于您计算的是 DISTINCT IP,当您按月进行 GROUP BY 时,每个分组(月)都会计算 DISTINCT IP,即,如果人们在多个月内访问,则可以多次计算。

例如:12.123.456.78访问三月和四月,就是每个月统计一个不同的IP,但如果不按月分组,就只有1个不同的IP,不能简单的将分组结果相加 COUNT(DISTINCT )在未分组时获得总计数(DISTINCT)。

此功能很有用,因为它可以阐明回头客与新访客的区别。

关于mysql - GROUP BY DAY(FROM_UNIXTIME) 意外更改计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17219208/

相关文章:

sql - 在 Microsoft SQL Server 2000 中模拟 MySQL LIMIT 子句

mysql - 如何查看MySql用户的创建时间?

mysql查询group by in group_concat

sql - Postgresql:创建一个插入查询,在一个范围内插入多条记录

MySQL:选择 2 个具有不同列名称和数量的表

SQL查询在单个事务中获取数据

mysql - 如何将HDFS输出存储到MySQL表?

MySQL,查询太慢,如何改善?

java - 无法使用 preparestatement 插入数据

sql - 获取列中多年的销售额总和