我们有一个 SQL 查询,可将联系人推送到邮件系统的队列中。我们意识到的一件事是我们的每个邮件 IP 都有自己的限制。这意味着我们可以为每个 IP 每个域发送 2 或 3 封电子邮件,而不是每分钟向所有目标域发送 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没有行号功能。这是使用行变量 here is the sample 完成的。 .
关于php - 限制 mysql 查询的多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317427/