我对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)