不是缺少结果

时间:2014-09-22 09:57:58

标签: mysql sql

我有一个非常简单的查询,“我想要所有没有role_type为'GROUP'的user_ids。以下sqlfiddle给出了我想要的正确结果http://sqlfiddle.com/#!2/0a9640/1但是当我运行查询时在我的实际MySQL数据库上,它不返回user_id = 13565的2个结果,我不知道为什么。

子查询给出单个答案8301,实际上如果我手动将此值输入到 括号即。

select * from role 
where role.user_id not in (
  select role.user_id 
  from role
  where role.role_type = 'GROUP' 
)
and (group_id=1465 or group_id=6314)
order by user_id

然后,两个失踪的结果以某种方式再次出现。当我使用带有NOT IN的子查询时,为什么会忽略这些结果?

2 个答案:

答案 0 :(得分:1)

not in的一个已知混淆是,如果子查询为任何元素返回NULL,则会过滤掉所有行。这可以通过明确检查来解决:

select r.*
from role r
where r.user_id not in (select r2.user_id 
                        from role r2
                        where r2.role_type = 'GROUP' and r2.user_id is not null
                       ) and
      r.group_id in (1465, 6314)
order by r.user_id;

我更喜欢使用not exists,因为NULL s没有此问题:

select r.*
from role r
where not exists (select r2.user_id 
                  from role r2
                  where r2.role_type = 'GROUP' and r2.user_id = r.user_id
                ) and
      r.group_id in (1465, 6314)
order by r.user_id;

编辑:

我怀疑问题是用户13565有一个role_type = 'GROUP'但是有一个不同的group_id。也许这是你真正想要的查询:

select r.*
from role r
where not exists (select 1
                  from role r2
                  where r2.role_type = 'GROUP' and r2.user_id = r.user_id and
                        r2.group_id in (1465, 6314)
                ) and
      r.group_id in (1465, 6314)
order by r.user_id;

答案 1 :(得分:0)

当我们考虑性能时,使用子查询不是最好的方法。

以下是您要查找的查询,不使用子查询

SELECT R.*
FROM role R
LEFT OUTER JOIN role R2 ON R2.user_id = R.user_id
                         AND R2.role_type = 'GROUP'
WHERE R.group_id IN (1465, 6314)
    AND R2.user_id IS NULL
ORDER BY R.user_id

希望这会对你有所帮助