我有这个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)
。
答案 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
)
;