使用NOT IN时查询问题,子选择返回NULL

时间:2015-01-03 18:09:24

标签: mysql

我想弄清楚这里有什么问题。基本上下面的查询查询表“配置文件 t1 ,然后再次使用NOT IN功能查询相同的表“配置文件”并从中获取profile_friends t2 并显示 t2 结果中未找到的ID的结果。

查询

SELECT t1.profile_id,  t1.profile_username, t1.profile_name, t1.profile_friends 
FROM PROFILES t1
WHERE t1.profile_id NOT IN (SELECT t2.profile_friends FROM PROFILES AS t2 WHERE t2.profile_id = '1')

以上查询和数据库结构的结果 enter image description here

此ID的 2,6,10 不应显示在此结果中。 ID ID 2 未显示,但为什么ID 6 10 正在显示?

但是当我尝试这段代码时它会起作用(请注意,我已经对值进行了硬编码)

SELECT t1.profile_id,  t1.profile_username, t1.profile_name, t1.profile_friends 
FROM PROFILES t1
WHERE t1.profile_id NOT IN (2,6,10)

1 个答案:

答案 0 :(得分:2)

您必须考虑NULL。与NULL进行的任何常规比较(=,<>,>,<)均为NULLNULL的正确比较是IS NULL

此外,您的案例中似乎不需要子查询。

SELECT *
  FROM profiles
 WHERE profile_id <> 1
   AND (profile_friends <> '1' OR profile_friends IS NULL) -- parentheses are important here

示例输出:

| PROFILE_ID | PROFILE_USERNAME | PROFILE_FRIENDS |
|------------|------------------|-----------------|
|          3 |        username3 |          (null) |
|          4 |        username4 |          (null) |
|          5 |        username5 |          (null) |
|          7 |        username7 |          (null) |
|          8 |        username8 |          (null) |
|          9 |        username9 |          (null) |

这是 SQLFiddle 演示