如何使用SQL检索表中所有记录的所有第3级子节点?

时间:2016-03-22 20:49:43

标签: mysql sql algorithm

我有一张这样的表:

item(id, parent_id, data)

表格中有多个数据集。每个数据集都有一个根记录,其中parent_id设置为-1。父记录的任何子项都将其parent_id记录设置为父项的id。任何后续孩子的parent_id都设置为他们的直接父母。

说我想获得所有根节点。这很容易

select * from item where parent_id = -1

选择所有非父节点也很容易:

select * from item where parent_id != -1

问题

如何只选择第3级节点(来自所有记录)?在我的具体情况下,我试图找到我的表中是否有任何第3级节点,或者确认表中的所有非根记录都是第2级节点。

奖金问题(在使用Tom的回答之后)

此查询返回50,003条记录:

SELECT
    count(L1.id)
FROM
    Item L1
WHERE
    L1.parent_id != -1;

这个记录会返回50,000条记录:

SELECT
    count(L2.id)
FROM
    Item L1
INNER JOIN Item L2 ON L2.parent_id = L1.id
WHERE
    L1.parent_id = -1;

如何隔离这3条记录,看看它们发生了什么?

注意

奖金 - 证明这3条记录是孤立的,没有与父母联系。

1 个答案:

答案 0 :(得分:2)

由于您只需要三个级别和三个级别,因此您只需JOIN可以达到该级别:

SELECT
    L3.id,
    L3.parent_id,
    L3.data
FROM
    Item L1
INNER JOIN Item L2 ON L2.parent_id = L1.id
INNER JOIN Item L3 ON L3.parent_id = L2.id
WHERE
    L1.parent_id = -1