4

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

这是我的输出:

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>
4

2 回答 2

0

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

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

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

于 2013-02-07T22:13:20.597 回答
0

您可以编写如下所示的 SQL 查询。基本上所有这些都是,对于数据库中返回的每一行,检查同一个表中具有该电子邮件地址的条目以及大于 -2(过去两分钟)的日期时间字段(在本例中为 Created)上的 timediff 和+2(未来两分钟)。如果在当前记录的两分钟内找到一条记录,它将 OccursWithinTimescale 字段值设置为匹配记录的 id 的值。因此,如果 OccursWithinTimescale 为空,则该电子邮件在两分钟内没有出现在表中,否则它有,并且您有违规记录的 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 is not null 上添加 where 子句来进一步调整该查询以仅返回在两分钟内发生的所有记录。

于 2013-02-07T22:25:20.050 回答