3

この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)です。

4

6 に答える 6

3

リクエストに応じて、回答としての私のコメント。

私の脳は「大文字と小文字を区別する」と言い、私の指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() を追加しました。

于 2013-03-21T08:46:25.913 に答える
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;
于 2013-03-20T14:05:35.177 に答える
1

NOT EXISTSNOT IN の代わりに試してください

そのように:

select e.* 
from emails as e 
where e.error <> 1 
AND e.login NOT EXISTS (select email_login from accounts ) 
于 2013-03-20T14:07:06.637 に答える
0
SELECT * 
FROM emails e 
WHERE e.error <> 1
AND NOT EXISTS (
 SELECT * FROM accounts a
 WHERE a.email_login = e.login
 )
;
于 2013-03-20T14:48:51.440 に答える
0

これは、e.login が NULL であるためである可能性があります。NULL 値を NOT IN として比較すると、常に false が返されます (ドキュメントを参照してください: NOT IN にも適用される演算子 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)))
于 2013-03-20T14:15:28.407 に答える
0

e.login または email_login のいずれかが のCHAR代わりにタイプを持っていると思いますVARCHAR。したがって、そのフィールドには空白が埋め込まれます。

于 2013-03-20T14:11:20.617 に答える