限制mysql查询的多个结果

时间:2012-07-03 19:01:14

标签: php mysql limit

我们有一个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上出现软弹跳或负反馈时,我们将能够限制或跳过目标域。

1 个答案:

答案 0 :(得分:1)

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

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