我有一张这样的表:
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条记录是孤立的,没有与父母联系。
答案 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