Mysql 没有遗漏的结果
我有一个非常简单的查询,“我想要所有没有“组”角色类型的用户id。下面的SQLFIDLE给出了我想要的正确结果,但是当我在实际的MySQL数据库上运行查询时,它不会返回用户id=13565的2个结果,我不知道为什么 子查询给出单个答案8301,如果我手动将此值输入 括号,即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
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
中执行它,并返回预期结果。我的查询与您的查询完全相同,我只是对其进行了优化(在我看来,使用子查询的性能更好,可读性更强)。