MySQL NOT IN不起作用

时间:2013-03-20 13:58:00

标签: mysql sql

我有这个MySQL查询:

select e.* 
from emails as e 
where e.error <> 1 
AND e.login NOT IN ( select email_login from accounts ) 

但它返回0行。

select e.* 
from emails as e 
where e.error <> 1 
AND e.id NOT IN (select email_id from accounts ) 

是否正常工作。

email_login为varchar(255),ID为int(11)

6 个答案:

答案 0 :(得分:2)

   SELECT e.* 
     FROM emails e 
     LEFT
     JOIN accounts a
       ON a.email_login = e.login
    WHERE e.error <> 1
      AND a.email_login IS NULL;

答案 1 :(得分:1)

尝试使用NOT EXISTS代替NOT IN

像那样:

select e.* 
from emails as e 
where e.error <> 1 
AND e.login NOT EXISTS (select email_login from accounts ) 

答案 2 :(得分:1)

根据要求,我的评论作为答案。

我的大脑说&#34;区分大小写&#34;,我的手指自动将IS NOT NULL添加到子查询中。我的智能手指在比较中绕过NOT NULL问题: - )。

这是您的工作查询:

SELECT e.* from emails AS e 
WHERE e.error <> 1 
AND UPPER(e.login) NOT IN 
(SELECTUPPER(email_login) FROM accounts WHERE email_login IS NOT NULL) 

我的手指这次也将UPPER()添加到该字符串比较中。

答案 3 :(得分:0)

我想e.login或email_login都有CHAR类型,而不是VARCHAR。因此,该字段用空格填充。

答案 4 :(得分:0)

这可能是因为e.login是NULL,当比较NULL valuse时,如同NOT IN一样,它总是返回false(请参阅适用于NOT IN的documentation: operator NOT LIKE)。

您可以使用COALESCE()进行检查:

  

返回列表中的第一个非NULL值,如果没有则返回NULL   非NULL值。

所以在你的情况下:

 SELECT e.* 
 FROM emails AS e 
 WHERE e.error <> 1 
 AND COALESCE(e.login,'') NOT IN (select email_login from accounts) 

如果这不起作用,请尝试根据比较LIKE运算符或修剪值的精确程度,以避免由于前导或尾随空格而产生差异

使用%LIKE%

 SELECT e.* 
 FROM emails AS e 
 WHERE e.error <> 1 
 AND NOT EXISTS (SELECT email_login 
                 FROM accounts 
                 WHERE email_login LIKE CONCAT('%', e.login ,'%'))

请注意%匹配任意数量的字符,包括零字符

匹配确切的登录信息

 SELECT e.* 
 FROM emails AS e 
 WHERE e.error <> 1 
 AND NOT EXISTS (SELECT email_login 
                 FROM accounts 
                 WHERE UPPER(TRIM(email_login)) = UPPER(TRIM(e.login)))

答案 5 :(得分:0)

SELECT * 
FROM emails e 
WHERE e.error <> 1
AND NOT EXISTS (
 SELECT * FROM accounts a
 WHERE a.email_login = e.login
 )
;