我有一个这样的表:
item(id, parent_id, data)
表中有多个数据集。每个数据集都有一个根记录,其中 parent_id
设置为 -1
。父记录的任何子记录都将其 parent_id
记录设置为父记录的 ID。任何后续子级都将其 parent_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 条记录是孤立的,没有连接到父级。
最佳答案
由于您只需要进入三个级别,而且正好是三个级别,您可以简单地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
关于mysql - 如何使用 SQL 检索表中所有记录的所有第 3 级子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36164927/