在分层树中查找叶节点

nic*_*ckf 15 sql database tree

我的数据库中有一个存储树结构的表.以下是相关领域:

mytree (id, parentid, otherfields...)
Run Code Online (Sandbox Code Playgroud)

我想找到所有叶子节点(即任何id不是另一个记录的记录parentid)

我试过这个:

SELECT * FROM mytree WHERE `id` NOT IN (SELECT DISTINCT `parentid` FROM `mytree`)
Run Code Online (Sandbox Code Playgroud)

但那回归了一个空集.奇怪的是,删除"NOT"会返回所有非叶节点的集合.

谁能看到我哪里出错了?

更新:感谢答案人们,他们都是正确的,并为我工作.我已经接受了丹尼尔的,因为它也解释了为什么我的查询不起作用(NULL的事情).

Dan*_*wak 21

您的查询不起作用,因为子查询包括NULL.以下略有修改对我有用:

SELECT * FROM `mytree` WHERE `id` NOT IN (
    SELECT DISTINCT `parentid` FROM `mytree` WHERE `parentid` IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

  • 我们如何从特定的祖先获得叶节点? (2认同)

The*_*edi 6

不知道为什么你的查询不起作用.左外连接语法中的相同内容 - 以这种方式尝试吗?

select a.*
from mytree a left outer join
     mytree b on a.id = b.parentid
where b.parentid is null
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 5

SELECT * FROM mytree AS t1
LEFT JOIN mytree AS t2 ON t1.id=t2.parentid
WHERE t2.parentid IS NULL
Run Code Online (Sandbox Code Playgroud)