作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有 3 个表来存储不同类型的用户
表1:所有用户,主键id
表2:admin用户,主键id,通过user_id连接到表1
表3:普通用户,主键id,通过user_id连接到表1
并且任何用户只能是一种类型的用户,也就是说表2和表3中的user_id不会冲突。
记录数:
表 1 : 100
表 2:30
表 3:70
SELECT * FROM `table_1`
WHERE `id` IN (
SELECT `user_id`
FROM `table_2`
)
这个返回 30 行是正确的。
但是,
SELECT * FROM `table_1`
WHERE `id` NOT IN (
SELECT `user_id`
FROM `table_2`
)
还我0。
我希望得到 70。
为什么会这样?
我的查询有没有错误?
谢谢
最佳答案
如果 table2 的 user_id 为空,则 NOT IN
永远不会为真,并且不会返回任何行。要么有子查询来避免那些空值:
SELECT * FROM `table_1`
WHERE `id` NOT IN (
SELECT `user_id`
FROM `table_2`
where `user_id` is not null
)
或者,使用NOT EXISTS
:
SELECT * FROM `table_1`
WHERE NOT EXISTS (
SELECT *
FROM `table_2`
where table2.`user_id` = table1.`user_id`
)
关于mysql - SQL IN 不是NOT IN 的反义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46072568/
我是一名优秀的程序员,十分优秀!