如何检测同一封电子邮件是否在2分钟内出现多次?

时间:2013-02-07 21:20:26

标签: php html sql if-statement

如何检测同一封电子邮件是否在2分钟内出现多次。

这是我的OutPut:

07-02-13 20:08:41   test11@gmail.com
07-02-13 20:09:41   test11@gmail.com
07-02-13 20:21:25   hottie@gmail.com
07-02-13 20:56:51   ugly@gmail.com
07-02-13 21:42:37   selma532@gmail.com
07-02-13 22:09:11   blalbla421@gmail.com

这是我的SQL语句。

$results = $this->EE->db->query("SELECT t.* FROM transactions as t WHERE t.cardid > 0 ORDER BY t.created DESC");

我希望他们分开她。因此,如果同一邮件出现2分钟,则必须进行不良交易。

foreach ($results->result_array() as $filter) 
{

我可以帮忙解决这个问题:我有一个$ filter ['created'] =这包含时间,我有一个$ filter ['email'])这包含电子邮件。

   if(//Filter goes here)
   {
$badtransactions[]=$filter;
   }
    else
   {
$cooltransactions[]=$filter;
   }
}

这是我的

<table class="table">
<h3>Cool Transactions (<?php print_r($sizeCoolTransactions)?>) </h3>
<thead>
<tr>
<th>Time</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<?php

//Foreach over cooltransactions
foreach($cooltransactions as $transaction)
{

// IS NEW?
$isactive = false;
if($transaction['created'] > time()-$refresh_timer){
$isactive = true;
}

// Get user mail.
$member_sql = $this->EE->db->query("SELECT email FROM exp_members WHERE member_id = '".($transaction['cardid']-10000000)."'");

$member_result = $member_sql->result_array();
if(isset($member_result[0]))
{
$member_result1 = $member_result[0];
}
?>
<tr class="<?= $isactive ? 'alert-success' : ''; ?>">

<td><?= date('d-m-y H:i:s', $transaction['created']); ?></td>
<td><?= isset($member_result1['email']) ? $member_result1['email'] : '<span style="color:red">Email mangler</span>'; ?></td>
</tr>
<?php
}
?>
</tbody>
</table>

2 个答案:

答案 0 :(得分:0)

这是你要找的吗?不幸的是它是为MSSQL编写的,但希望你可以改变语法来使用你的RDBMS。

基本上设置当前时间(我默认为了适应所提供的数据)并使用DATEADD()创建范围。查询日期时间在过去2分钟内为您提供所有电子邮件的范围内。最后将它包装在GROUP BY Email HAVING COUNT(*)&gt;中。 1显示所有重复项。

http://sqlfiddle.com/#!3/1d759/17

答案 1 :(得分:0)

您可以编写如下所示的SQL查询。基本上所有这一切都是,对于数据库中返回的每一行,检查同一个表中是否有该电子邮件地址的条目和datetime字段(在本例中为Created)的timediff大于-2(过去两分钟)和+2(将来两分钟)。如果在当前记录的两分钟内找到记录,则会将OccursWithinTimescale字段值设置为匹配记录的id的值。因此,如果OccursWithinTimescale为null,那么该表中的电子邮件在两分钟内没有发生,否则就会发生,并且您拥有违规记录的ID。

select l1.id, created,
(select max(id) from log where email = l1.email 
    and (
            (minute(timediff(created, l1.created)) <= 2 and minute(timediff(created, l1.created)) >= -2)
        ) 
    and id <> l1.id
    and date(created) = date(l1.created)
) as OccursWithinTimescale, 
l1.email from log l1 

使用此方法存在一些限制,因为我没有包含任何关于索引的内容,您需要使用这种子查询来查看。此外,如果在大型数据集上使用子查询,则可能是一个巨大的耗尽。但它至少是一种选择,尽管可能不是最佳选择。

您可以通过在OccursWithinTimescale上添加一个where子句来返回仅返回在两分钟内发生的所有记录,您可以进一步调整该查询。