php – 选择自引用表上任何其他行未指向的行

我有一个自引用表,我很难找到没有任何其他行指向它的行 – 或者换句话说,将那些不是父项的行提供给任何其他行,这意味着,当然,他们没有孩子.

这是我的样本数据表:

+----+------+--------+
| id | name | cat_id |
+----+------+--------+
|  1 | C1   |        |
|  2 | C2   |        |
|  3 | C3   |      1 |
|  4 | C4   |      2 |
|  5 | C5   |      2 |
|  6 | C6   |      5 |
+----+------+--------+

这里,cat_id是父.这是一个’代表’:

.
├──C1
| └──C3
└──C2
    ├──C4
    └──C5
        └──C6

如图所示,类别可以无限期地具有子类别,并且通过指向cat_id来定义它们.如果它是一个“主要”类别,它只是没有指向任何东西.我可以通过在cat_id中选择NULL来获取所有没有“父”的类别,但是如何选择没有“子”的类别?

我试过了:

SELECT
    c1.id, c1.name, c1.cat_id
FROM
    cat c1
INNER JOIN
    cat c2
ON
    c1.id != c2.cat_id

但这不仅返回重复的行,还包括具有子节点的类别.预期结果在表示中以粗体显示.您可以在this SQLFiddle中运行测试.

我怎么能做到这一点?没有递归是否可以实现?

解决方法:

这可能是您在初始查询中的目标:

select a.*
from cat a left outer join
   cat b on a.id = b.cat_id
where b.cat_id is null

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...