我有两个表,users
和email_logs
,users
有列name
和email
,email_logs
有列email
。我想做的是从users
表中提取所有电子邮件和名称,如果某个电子邮件已经存在于email_logs
表中,那么就不应该提取它。
我试过这个:
$emails_array = 'one@gmail.com, two@gmail.com, three@gmail.com';
$query = $db->query("SELECT name,email FROM ".TABLE_PREFIX."users WHERE email NOT IN ({$emails_array})");
但它并没有删除email_logs
表中已经存在的电子邮件。
请帮忙!
SELECT name,email
FROM users WHERE email NOT IN (SELECT email FROM email_logs);
SELECT u.name,u.email FROM users u
LEFT JOIN email_logs as e ON u.email = e.email
WHERE e.email is not null
$emails_array = "'apple', 'banana', 'coconut'";
SELECT u.name, u.email FROM users u
WHERE u.email NOT IN ( {$emails_array} )
您的IN
使用不正确。每个字符串/电子邮件都应该用引号括起来,比如:
WHERE u.email NOT IN ( 'apple', 'banana', 'coconut' )
之所以不起作用,是因为您创建了一个巨大的字符串,而不是创建一个数组,查询将根据该字符串进行检查。
相反,试着使用这个:
$emails_array = array( 'one@gmail.com', 'two@gmail.com', 'three@gmail.com' );
用于定义包含三封电子邮件的字符串:
$email_string = "'" . implode( "', '", $emails_array ) . "'";
最后,运行您的查询
$query = $db->query("SELECT name,email FROM ".TABLE_PREFIX."users WHERE email NOT IN ({$email_string})");