您将如何选择彼此在一定时间内带有时间戳的记录?
应用和寻求的解决方案:
我有一个包含点击记录的表,我想通过并找到在特定时间段内发生的来自同一 IP 的点击。
例如:SELECT ALL ip_address WHERE 5 个或更多相同的 ip_address,发生/被分组/时间戳,彼此相隔 10 分钟
你可以选择这样的记录
$recorddate = date("Y-m-d");
SELECT * FROM table WHERE date > UNIX_TIMESTAMP('$recorddate');
UNIX_TIMESTAMP 函数将日期转换为时间戳。您可以轻松地在查询中使用它。
如果您想以 10 分钟的间隔获取记录,您可以执行类似的操作
$starttime = "2012-08-30 19:00:00";
$endtime = "2012-08-30 19:10:00";
SELECT * FROM table WHERE date >= UNIX_TIMESTAMP('$starttime') AND date <= UNIX_TIMESTAMP('$endtime') ;
决定不尝试对原始数据进行单一查询。
与朋友讨论后,然后阅读有关提及内存引擎和 PHP memcatch 的选项;我决定使用常规表格来记录使用生存时间时间戳的点击次数。在该时间戳通过后,分配一个新的 ttl 并重新设置计数。一件事是对于我的应用程序,我无法确切确定参数配置设置将持续多长时间 - 如果它们更大并且内存被清除,那么事情就会重新开始。
如果它在用户链接点击时运行,这不是一个完美的解决方案,但它应该很好地捕捉点击欺诈风暴并完成工作。
一些管理 PHP/MySQL 代码(“Drupalized 查询”):
$timeLimit = $clickQualityConfigs['edit-submitted-within-x-num-of-same-ip-clicks']." ".$clickQualityConfigs['edit-submitted-time-period-same-ip-ban']; // => 1 days // e.g.
$filterEndTime = strtotime("+".$timeLimit);
$timeLimitUpdate_results = db_query('UPDATE {ip_address_count}
SET ttl_time_stamp = :filterendtime, click_count = :clickcountfirst WHERE ttl_time_stamp < :timenow', array(':filterendtime' => $filterEndTime, ':clickcountfirst' => '0', ':timenow' => time()));
$clickCountUpdate_results = db_query('INSERT INTO {ip_address_count} (ip_address,ttl_time_stamp,click_count)
VALUES (:ipaddress,:timestamp,:clickcountfirst)
ON DUPLICATE KEY UPDATE click_count = click_count + 1', array(':ipaddress' => $ip_address,':timestamp' => $filterEndTime,':clickcountfirst' => '1'));
数据库信息:
CREATE TABLE `ip_address_count` (
`ip_address` varchar(24) NOT NULL DEFAULT '',
`ttl_time_stamp` int(11) DEFAULT NULL,
`click_count` int(11) DEFAULT NULL,
PRIMARY KEY (`ip_address`)
)