选择在彼此的特定时间范围内加上时间戳的记录

时间:2012-08-29 22:38:03

标签: mysql sql

您如何选择在一定时间内彼此加上时间戳的记录?

申请和寻求解决方案:

我有一张包含点击记录的表格,我希望能够查看在特定时间段内发生的同一IP点击。

例如:SELECT ALL ip_address在相同的ip_address中发生5个或更多,发生/分组在/时间戳内,彼此在10分钟内

2 个答案:

答案 0 :(得分:1)

你可以选择那样的记录

$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') ;

答案 1 :(得分:0)

决定不对原始数据进行单一查询。

与朋友讨论后,再阅读提及内​​存引擎的选项,以及PHP memcatche;我决定使用常规表来记录使用时间生存时间戳的点击次数。在传递时间戳之后,分配新的ttl并重新设置计数。 有一件事是我的应用程序我不能确切地确定参数配置设置有多长 - 如果它们更大并且内存被清除,那么事情就会重新开始。

如果它是在用户链接点击上运行的话,它不是一个完美的解决方案,但它应该非常适合捕捉点击欺诈风暴,并且完成这项工作。

一些管理PHP / MySQL代码(“Drupalized queries”):

$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`)
)