2012-07-03 150 views
0

我们有一个将联系人推送到我们的邮件系统队列中的sql查询。我们认识到的一件事是我们每个邮件IP都有自己的限制。这意味着不用邮寄每分钟发送2或3封电子邮件给所有目标域,我们可以每个域发送2或3个IP ,域名为。我们有一个工作查询可以交叉检查我们的黑名单以及我们的跟踪系统,因此我们不会向已执行操作的用户重新发送邮件。限制mysql查询的多个结果

$query = "SELECT `email`,`template`,`id` FROM `q_main` WHERE 
      `email` NOT IN (SELECT `email` FROM `c_blacklist` WHERE `email` = `q_main`.`email`) AND 
      `email` NOT IN (SELECT `s_log`.`email` FROM `s_log`,`t_analytics` WHERE `t_analytics`.`key` = `s_log`.`key` AND `q_main`.`template` = `t_analytics`.`campaign_id`) LIMIT ".$num_nodes.""; 

上述查询完美无缺。它只是获取与查询结果相匹配的下一组电子邮件,而不考虑目标域。该限制是通过将ip地址数量乘以每个ip的最大每分钟数量(通常为2或3分钟)来设置的。

要收集队列中所有可用的目标域,我们可以运行下面的查询。这会提取队列中的所有目标域以及计数。

$query = "SELECT SUBSTRING_INDEX(email, '@', -1) AS dd, COUNT(*) AS cc FROM q_main GROUP BY SUBSTRING_INDEX(email, '@', -1) ORDER BY cc DESC"; 
$result = mysql_query($query) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
     $send_domains[] = $row['dd']; 
    } 

下面是我们的测试查询,它基本上什么都不做。它查询与第一个查询相同的内容,只是现在它使目标域数组崩溃。它没有做的是限制每个目标域的结果,这是我们正在努力完成的。

$query = "SELECT `email`,`template`,`id` FROM `q_main` WHERE 
      `email` NOT IN (SELECT `email` FROM `c_blacklist` WHERE `email` = `q_main`.`email`) AND 
      `email` NOT IN (SELECT `s_log`.`email` FROM `s_log`,`t_analytics` WHERE `t_analytics`.`key` = `s_log`.`key` AND `q_main`.`template` = `t_analytics`.`campaign_id`) AND 
      `email` LIKE '%".implode("' OR `email` LIKE '%",$send_domains)."' "; 

总结这一切,我们正在努力做的是选择和限制记录基于每一个目标域。我们如何设定每个目标域的限制而不限制整个查询,就像我们在第一个例子中所做的那样?我们确实尝试通过每个目标域循环查询,但它的表现并不好。

对于那些好奇的人,我们正在尝试这样做来实现邮件IP的评分系统。这样,当软启动或负面反馈通过特定ip时,我们将能够限制或跳过目标域。

+2

请不要将'mysql_ *'函数用于新代码。他们不再被维护,社区已经开始[弃用流程](http://goo.gl/KJveJ)。请参阅[**红框**](http://goo.gl/GPmFd)?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定,[本文](http://goo.gl/3gqF9)将有助于选择。如果你关心学习,[这里是很好的PDO教程](http://goo.gl/vFWnC)。 –

回答

1

在单独的表中维护每个域的限制并将该表连接到您的查询,以便每个域都可以使用该限制。然后,为每个域编号。在where条件中,排除rownumber>域限制的行。

这就是说,mysql没有行号功能。它使用行变量here is the sample完成。