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

标签 mysql sql algorithm

我有一个这样的表:

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/

相关文章:

php - 我应该使用什么数据类型将电子邮件存储在 mysql 数据库中?

php - 如果未为发布设置缩略图,则 SQL 查询不会显示结果

PHP 脚本向一张表添加两行

mysql - 如何使用 GROUP BY 两次而不是 JOIN 本身?

python - 如何减少python列表算法中k个连续数字的最大和的执行时间

algorithm - 查询n次时如何改进Dijkstra算法?

MySQL 联合、连接和限制

sql - 检索每个学生的最新考试行

sql - 如何避免 mysql 查询中出现重复?

python - 使用列表列表查找所有加起来等于给定数字 python 的组合