我对SQL还是很陌生,试图绕过它,但是有点令人困惑。这是我正在使用的东西的简化版本。
我有这张桌子叫people:
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 | +----+------------+-----------+
上表是人员清单。他们的parent_id列指的是他们的父母。如果表上没有父母,则他们的parent_id为0。
现在,我希望能够获得每组人的单独列表:祖父母,子女和孙子女。
很容易获得祖父母(拉里和凯文),我可以执行以下查询:
SELECT name FROM people WHERE parent_id = 0
但是当涉及到生子(约翰,拉里,杰森和米尔德雷德)和孙子(鲍勃和梅贝尔)时,我迷路了。
用英语来说,这就是获取孩子的过程:“从表中获取所有结果。对于每个结果,请查看其父ID。在具有该ID作为其ID的表中查找结果。请查看 该人的 ID,如果为0,则原始人是孩子。将其添加到我们要显示的列表中。”
对于孙子代来说,情况与上述相同,只是增加了一个步骤。
那有意义吗?如何在上面将我的过程编写为SQL查询?
这可以使用简单的方法解决JOIN。
JOIN
要选择子代列表:
SELECT c.name FROM people p JOIN people c ON c.parent_id = p.id WHERE p.parent_id = 0
要选择孙子列表:
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