2012-12-06 2 views
1

모든 반송 된 전자 메일이 내 데이터베이스의 테이블로 전송됩니다. 내 활성 이메일로 채워지는 다른 테이블의 필드와 비교하려고합니다. 다음 함수를 사용하면 "IN"을 사용할 때 아무것도 반환하지 않으며 "NOT IN"을 사용할 때는 모두 반환하지만 두 테이블에 일치하는 전자 메일이 있다는 것을 알고 있습니다. 내가 잘못하고있는거야?IN 연산자의 PHP/MySQL 문제

<?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>";                            
    }                                           
}                                            
?> 
+0

bad_emails에 가입 된 email_database를 선택하여이 쿼리를 수행 할 수 있습니다. – Scuzzy

+0

이 조인으로 시작되었습니다. 이제이 쿼리를 mike의보다 효율적인 조인으로 반환했지만 여전히 정확한 값을 반환하지 않습니다. –

답변

1

당신은이 같은 단일 쿼리의 모든 훨씬 더 친절하게이 작업을 수행 할 수 있습니다 : 나는 b.emails (복수)를 사용 e.email에 가입

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 

주 (단수) 당신이 보여 일치하는 검색어. 당신이 bad_emails에서 정확하게 필드 이름을 참조하지 않는다면 빈 결과 집합을 얻고 있다는 점에서 이것이 실제로 문제가 될 수 있다고 생각합니다 (실제로는 단지 email입니까?). 그것은 당신이보고있는 정확한 IN/NOT IN 행동으로 이어질 것입니다.

올바른 이름이 무엇이든간에 내 쿼리를 변경하십시오.

+0

감사합니다. 마이크, 내 쿼리와 동일한 결과를 얻으려고했지만 더 빨리 반환합니다. 이제는 왜 작동하지 않을지 알아야합니다. –

+0

이메일 문자열에 약간의 차이가 있어야합니다. 어쩌면 여분의 공백 패딩이 있을까요? –

+0

좋은 아이디어, 나는 일치하는 이메일의 일부를 비교하고 볼 것이다. 나는 돌아올거야. 덕분에 –