MySQL“NOT IN”查询不起作用

Posted

技术标签:

【中文标题】MySQL“NOT IN”查询不起作用【英文标题】:MySQL "NOT IN" query not working 【发布时间】:2012-02-18 18:14:48 【问题描述】:

我有一个包含三列的表:taxon_idscientific_name_element_idparent_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 &lt;&gt; 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 数据库运行查询,但不明白为啥它不起作用

Yii2 NOT IN条件不起作用

Sql server not in 子句不起作用

Django ORM:相当于 SQL `NOT IN`? `exclude` 和 `Q` 对象不起作用

在 MYSQL 中使用 NOT IN 和 GROUP CONCAT

MySQL 查询在 Access 上不起作用