IN运算符的PHP / Mysql问题

时间:2012-12-06 01:17:02

标签: php mysql select

所有退回的电子邮件都会发送到我的数据库中的表格。我试图将它们与另一个填充了我的活动电子邮件的表中的字段进行比较。使用以下函数时,在使用“IN”时全部返回,而在使用“NOT IN”时全部返回,但我知道两个表中有匹配的电子邮件。我是以错误的方式去做的吗?

<?php
function CompareEmails() {
    $mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") ";
        echo $mysqli->connect_error;
        $mysqli->close();
    }

    $bademails = array();
    $values = $mysqli->query("SELECT bad_emails.emails FROM bad_emails ");

    while ($row = $values->fetch_assoc()) {
        $bademails[] = $row['emails'];
    }

    $query = "SELECT email_database.customer_id, email_database.email 
              FROM email_database 
              WHERE email_database.email IN('" . implode("' , '", $bademails) . "') 
              ORDER BY email_database.customer_id DESC";

    $values2 = $mysqli->query($query);

    while ($row2 = $values2->fetch_assoc()) {
        echo $row2['customer_id'] . " " . $row2['email'] . "</br>";                                                                                                            
    }                                                                                                                                                                          
}                                                                                                                                                                              
?>

1 个答案:

答案 0 :(得分:1)

您可以在单个查询中更好地完成此操作:

SELECT e.customer_id, e.email
FROM email_database AS e
INNER JOIN bad_emails AS b ON e.email = b.emails
ORDER BY e.customer_id DESC

请注意,我使用b.emails(复数)加入e.email(单数)来匹配您在查询中显示的内容。我猜这可能实际上是你遇到的问题,如果你没有在bad_emails中正确引用字段名称,你可能会得到一个空的结果集(它真的只是email吗?)。这将导致你所看到的确切的IN / NOT IN行为。

只需更改我的查询即可使用正确名称。