SQL查询只选择孙子

esh*_*orn 6 mysql sql

我对SQL很陌生,试图绕过它,但它有点令人困惑.这是我正在使用的简化版本.

我有这个表叫people:

+----+------------+-----------+
| id | name       | parent_id |
+----+------------+-----------+
|  1 | Bob        | 3         |
|  2 | John       | 5         |
|  3 | Larry      | 4         |
|  4 | Kevin      | 0         |
|  5 | Kyle       | 0         |
|  6 | Jason      | 5         |
|  7 | Mildred    | 4         |
|  8 | Mabel      | 6         |
+----+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

上表是一份人员名单.他们的parent_id列指的是他们的父母是谁.如果桌子上没有父母,则他们的parent_id为0.

现在,我希望能够获得每组人员的单独列表:祖父母,子女和孙子女.

很容易得到祖父母(拉里和凯文),我可以这样查询:

SELECT name FROM people WHERE parent_id = 0
Run Code Online (Sandbox Code Playgroud)

但是当涉及到让孩子(约翰,拉里,杰森和米尔德里德)和孙子(鲍勃和梅布尔)时,我迷路了.

在英语中,这将是获取孩子的过程:"从表中获取所有结果.对于每一个,查看他们的父ID.在表中找到具有该ID作为他们的id的结果.查看该人的 id,如果它是0,原来的人就是孩子.将它们添加到我们将要显示的列表中."

对于孙子,它将与上面相同,但只是增加一步.

那有意义吗?如何将上面的进程编写为SQL查询?

小智 9

这可以通过简单的方法解决JOIN.

要选择子项列表:

SELECT c.name
FROM people p
JOIN people c ON c.parent_id = p.id
WHERE p.parent_id = 0
Run Code Online (Sandbox Code Playgroud)

要选择孙子列表:

SELECT gc.name
FROM people p
JOIN people c ON c.parent_id = p.id
JOIN people gc ON gc.parent_id = c.id
WHERE p.parent_id = 0
Run Code Online (Sandbox Code Playgroud)