MySQL SELECT x FROM WHERE NOT IN(SELECT x FROM b) - 意外结果

Chr*_*ess 30 mysql sql

我希望下面第三个查询的结果包含id = 732.它没有.这是为什么?

mysql> SELECT id FROM match ORDER BY id DESC LIMIT 5 ;
+------------+
|         id |
+------------+
|        732 | 
|        730 | 
|        655 | 
|        458 | 
|        456 | 
+------------+
5 rows in set (0.00 sec)

mysql> SELECT id FROM email ORDER BY id DESC LIMIT 5 ;
+------------+
|         id |
+------------+
|        731 | 
|        727 | 
|        725 | 
|        724 | 
|        723 | 
+------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email ) ;
Empty set (0.00 sec)

表email.id中有三个NULL条目,match.id中没有NULL条目.

可以在以下位置查看完整的表/查询 http://pastebin.ca/1462094

Qua*_*noi 48

来自文档:

为了符合SQL标准,不仅IN 返回NULL左侧的表达式NULL,而且如果在列表中找不到匹配项,并且列表中的一个表达式是NULL.

这正是你的情况.

二者INNOT IN返回NULL其不是一个可接受的条件WHERE子句.

重写您的查询,如下所示:

SELECT  *
FROM    match m
WHERE   NOT EXISTS
        (
        SELECT  1
        FROM    email e
        WHERE   e.id = m.id
        )
Run Code Online (Sandbox Code Playgroud)


小智 38

...或者如果你真的想用,NOT IN你可以使用

SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email WHERE id IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案。不知道“where id is not null null”是使“not in”查询工作所必需的。 (2认同)

Eri*_*ric 6

我对MySQL如何处理空值的细节有点脱节,但这里有两件事要尝试:

SELECT * FROM match WHERE id NOT IN 
    ( SELECT id FROM email WHERE id IS NOT NULL) ;

SELECT
    m.*
FROM
    match m
    LEFT OUTER JOIN email e ON
        m.id = e.id
        AND e.id IS NOT NULL
WHERE
    e.id IS NULL
Run Code Online (Sandbox Code Playgroud)

第二个查询看起来很直观,但它确实是连接条件,然后是where条件.这是连接和where子句不相等的情况.