MySQL“NOT IN”查询不起作用
Posted
技术标签:
【中文标题】MySQL“NOT IN”查询不起作用【英文标题】:MySQL "NOT IN" query not working 【发布时间】:2012-02-18 18:14:48 【问题描述】:我有一个包含三列的表:taxon_id
、scientific_name_element_id
和 parent_id
。我想找到是孩子而不是父母的元素,所以是结构的终点。
我发现了一些建议我使用的来源
select taxon_id
from taxon_name_element
where taxon_id not in
(select parent_id from taxon_name_element)
但这不起作用,当我实际浏览条目并看到有taxon_id=1
和NO parent_id=1
时,我得到一个空集
相反,当我看到 parent_id 中的 taxon_id 时,我得到一个非空结果集
我做错了什么?我该如何解决这个问题?
【问题讨论】:
SQL NOT IN constraint and NULL values 的可能重复项 感谢 ruakh,我添加了一个非空要求并且它有效。我理解正确吗?:如果将 taxon_id 与 NULL 进行比较,它返回未知,并且未知添加到任何数字都会产生未知,因此结果是没有行?感谢您的链接k 是的,完全正确。像3 <> NULL
这样的东西是不确定的,因为NULL
可能是三; 3 NOT IN (1, 2, NULL)
也是如此。 mysql 将只返回 已知 以满足 WHERE
子句的行。
【参考方案1】:
taxon_name_element.parent_id
中有 NULL 吗?
查询...
select taxon_id
from taxon_name_element
where taxon_id not in (
select parent_id
from taxon_name_element
)
...等价于...
select taxon_id
from taxon_name_element
where
taxon_id <> parent_id_1
AND taxon_id <> parent_id_2
...
AND taxon_id <> parent_id_N
...其中parent_id_X
是当前位于parent_id
列中的实际值。如果其中一个为 NULL,则相应的taxon_id <> parent_id_X
表达式将“折叠”为 NULL,并拖拽整个 WHERE 表达式。
过滤掉 NULL 以获得你想要的:
select taxon_id
from taxon_name_element
where taxon_id not in (
select parent_id
from taxon_name_element
where parent_id is not null
)
【讨论】:
【参考方案2】:假设 parent_id 列是 NULL(表示没有设置值)
选择所有对 parent_id 没有值的 scientific_name_element_id(意味着 parent_id 为 NULL)
你这样做:
SELECT scientific_name_element_id
FROM YOUR_TABLE
WHERE parent_id IS NULL
这将为您提供一个没有父代的 science_name_element_id 列表。
【讨论】:
我想你一定误解了这个问题。您的查询将找到没有parent 的记录。 OP 想要查找没有 children 的记录。 (顺便说一下,表的名字是taxon_name_element
。)以上是关于MySQL“NOT IN”查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章
我遇到了一个奇怪的问题,使用 NOT IN 对 PostgreSQL 数据库运行查询,但不明白为啥它不起作用
Django ORM:相当于 SQL `NOT IN`? `exclude` 和 `Q` 对象不起作用