我正在使用 Amazon S3 为播客提供 MP3 文件。Amazon 提供访问日志,我将其获取并存储在 MySQL 数据库中。数据库如下所示:
request_id varchar(16)
time int(10)
file varchar(255)
sent bigint(20)
size bigint(20)
status smallint(5)
ip varchar(39)
referrer varchar(255)
user_agent varchar(255)
因为这是一个播客,大量的点击是 206 个范围请求(来自 iTunes/iOS),以小块的形式请求每个文件。
我也有一些人不止一次下载该文件。
所以我想做的是构建一个查询:
- 每个文件、每个 IP 仅提供一个结果(因此每个 IP/人只能算作每个文件的一次“命中”)。
- 将每个文件/IP发送的所有字节(列)的总和相加,
sent
因此我可以看到该特定文件/IP 组合的所有范围请求的总数是多少。 - 奖励:比较
sent
每个文件/IP 列的总和,并且仅在字节总和 >=size
列的 75% 时返回该结果(目前我正在使用 PHP 进行此比较后查询)。
这是我目前正在使用的,我相信它正在工作,但它的完整后果对GROUP BY
我来说是一个谜(例如 - 列顺序GROUP BY
是否重要?):
SELECT FROM_UNIXTIME(time,'%M %D') as date, ip, file, SUM(sent) as sent, size
FROM stats
WHERE sent > 0
AND size > 0
AND FROM_UNIXTIME(time, '%Y-%m-%d') >= '2012-09-01'
AND FROM_UNIXTIME(time, '%Y-%m-%d') <= '2012-09-30'
GROUP BY ip, file
ORDER BY time ASC, file ASC
有人在这里看到任何潜在的陷阱吗?