1

所有退回的电子邮件都会发送到我数据库中的一个表中。我正在尝试将它们与另一个表中的字段进行比较,该表中填充了我的活动电子邮件。使用以下函数,在使用“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>";                                                                                                            
    }                                                                                                                                                                          
}                                                                                                                                                                              
?>
4

1 回答 1

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 行为。

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

于 2012-12-06T01:24:27.073 回答