Php 限制mysql查询的多个结果

Php 限制mysql查询的多个结果,php,mysql,limit,Php,Mysql,Limit,我们有一个sql查询,它将联系人推送到邮件系统的队列中。我们意识到的一件事是,我们的每个邮件ip都有自己的限制。这意味着,我们可以在每个域的每个ip上发送2或3封电子邮件,而不是每分钟为每个ip发送2或3封电子邮件。我们有一个工作查询,可以交叉检查我们的黑名单和跟踪系统,这样我们就不会再向执行过操作的用户发送邮件 $query = "SELECT `email`,`template`,`id` FROM `q_main` WHERE `email` NOT IN (SE

我们有一个sql查询,它将联系人推送到邮件系统的队列中。我们意识到的一件事是,我们的每个邮件ip都有自己的限制。这意味着,我们可以在每个域的每个ip上发送2或3封电子邮件,而不是每分钟为每个ip发送2或3封电子邮件。我们有一个工作查询,可以交叉检查我们的黑名单和跟踪系统,这样我们就不会再向执行过操作的用户发送邮件

$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上出现软反弹或负面反馈时,我们可以限制或跳过目标域。

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


也就是说,mysql没有行号函数。它是使用一个行变量来完成的。

请不要对新代码使用
mysql.*
函数。它们不再得到维护,社区已开始恢复。看到了吗?相反,你应该学习并使用或。如果你不能决定,将帮助你做出选择。如果你想学习。