Mysql 没有遗漏的结果

Mysql 没有遗漏的结果,mysql,sql,Mysql,Sql,我有一个非常简单的查询,“我想要所有没有“组”角色类型的用户id。下面的SQLFIDLE给出了我想要的正确结果,但是当我在实际的MySQL数据库上运行查询时,它不会返回用户id=13565的2个结果,我不知道为什么 子查询给出单个答案8301,如果我手动将此值输入 括号,即 select * from role where role.user_id not in ( select role.user_id from role where role.role_type = 'GRO

我有一个非常简单的查询,“我想要所有没有“组”角色类型的用户id。下面的SQLFIDLE给出了我想要的正确结果,但是当我在实际的MySQL数据库上运行查询时,它不会返回用户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的子查询时,这些结果会被删除吗?

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;
我更喜欢使用
notexists
,因为
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有一个
角色类型='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;

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

以下是您正在查找的查询,不使用子查询:

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

希望这能帮助您

这些行的组id是否为空?不要向我们显示它工作的数据,而是它不工作的数据。@Ben,这些行的组id不是空的,数据与SQLfiddle中的数据完全相同(它缺少角色id列,但也不是空的)@fancyPants,我想要的行的数据与SQL fiddle相同…我将添加缺少的'role_id'colulmnI没有本地MySQL实例可供测试,但是如果您的实例中的数据、模式和查询与fiddle中的数据、模式和查询相同,这应该可以工作。如果粘贴fiddle的整个脚本会发生什么(包括创建和插入)到MySQL?“这是一个已知的问题"有点夸张。这是用SQL语言设计的。它仍然漏掉了最后2个结果。这只是行为不正常。如果我在SQL fiddle上运行该查询,那么我会得到预期的5个结果,如果我在DB上运行,那么我只得到3个!如果我在sebquery中手动输入8301,那么我会得到5个。@DrDan…我猜你有一些une数据库中的预期数据。可能
的名称有误或其他不同。@horse\u没有名字…我真的不知道有谁认为
的行为不在
中,而
为NULL
是直观的。当然,这是从
为NULL
的值的语义得出的,所以这种行为是正确的。我改变了将“问题”一词改为“混乱”。混乱将其钉住;)这将在SQL FIDLE中给出2个结果,而不是我需要的5个结果。在我的DB中,它再次给出0,因为组id=6314的结果由于某种原因不会返回,除非我在子查询中手动输入8301。几秒钟前,我修复了我的查询,在
子句中有一个拼写错误(1456而不是1465)。没有看到该拼写错误,感谢您的更改。不过,我仍然没有得到这两个结果。我就是不明白为什么,这应该这么简单!:)@DrDan我只需复制/粘贴查询,在
sqlfiddle
中执行它,并返回预期结果。我的查询与您的查询完全相同,我只是对其进行了优化(在我看来,使用子查询的性能更好,可读性更强)。