我有一个非常简单的查询,“我想要所有没有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的子查询时,为什么会忽略这些结果?
答案 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
希望这会对你有所帮助