我试图识别树上的"叶子",但我不明白为什么我的查询没有给出我想要的.

问题是:

enter image description here

所以我的 idea 是,只要id不在p_id列中,那么它就应该是一片"叶子"

select id, 'Leaf' as type
from Tree
where id not in (select distinct(p_id)
                 from Tree)

然而,上面的查询没有给我任何结果.

这个解决方案与我的几乎相同,只是它指定p_id不能为NULL,然后返回我想要的.

select id
from Tree
where id not in(select distinct(p_id) 
                from Tree 
                where p_id IS NOT NULL)

我很困惑,为什么添加where条款会产生影响?

推荐答案

你猜对了.这是因为NULL不能与任何东西进行比较.一个值和null没有区别,一个值和null也不一样.

您可以通过以下查询获得结果:

select distinct t.id, 
  if (p.id is null, 'Root', if (d.id is null, 'Leaf', 'Inner'))
from Tree t
  left join Tree p on p.id=t.p_id
  left join Tree d on d.p_id=t.id;

dbfiddle.

Mysql相关问答推荐

如何从mysql中的不可用日期范围获取可用日期范围?

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

根据 JOIN 结果计算列中的值?

如何在 mysql 中获取 Day Wise 的平均值?

为什么以及如何将 Django filter-by BooleanField 查询转换为 SQL WHERE 或 WHERE NOT 而不是 1/0?

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

如何 Select 具有最新的 2 个日期字段的行?

MySQL 根据另一列中的值更改空值

使用 JOIN 计算列中的所有值

如何在每个国家/地区查询 GHTorrent(类 SQL 语言)的最常用语言

INNER JOIN 问题(MySQL 错误代码:1054)

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

此插页中的X是什么> X'3C2F756C3E'

动态创建内联 SQL 表(用于排除左连接)

MySQL:低基数/ Select 性列=如何索引?

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

MySQL如何为数据库中的所有表生成DDL

在 WHERE 子句中使用 mysql concat()?

如何将 mysqldump 的输出拆分为较小的文件?

从 MySQL JSON 数据类型中提取不带引号的值