如何检测同一封电子邮件是否在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>
答案 0 :(得分:0)
这是你要找的吗?不幸的是它是为MSSQL编写的,但希望你可以改变语法来使用你的RDBMS。
基本上设置当前时间(我默认为了适应所提供的数据)并使用DATEADD()创建范围。查询日期时间在过去2分钟内为您提供所有电子邮件的范围内。最后将它包装在GROUP BY Email HAVING COUNT(*)&gt;中。 1显示所有重复项。
答案 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子句来返回仅返回在两分钟内发生的所有记录,您可以进一步调整该查询。