SQL 仅查询 select 有孙辈的条目

SQL query to select only entries that have grandchildren

昨天我问 关于 select 仅大 children 条目。我花了一段时间,但我终于想出了如何做我想做的事。

不过,现在,我需要做点别的:select 仅 grandparent 个条目(按 "grandparent",我的意思是那些没有 parent,即他们的 parent_id 是 0),但只有那些有 grandchild 的,不管他们是否有 child。

这是 table 我有:

+-----+-------------+-----------+
| 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         |
|  9  | Amber      | 4         |
|  10 | Devon      | 5         |
|  11 | Zack       | 0         |
|  12 | Alfred     | 11        |
|  13 | Robert     | 11        |
|  14 | Keith      | 11        |
|  15 | David      | 0         |
|  16 | Wilbur     | 15        |
+-----+------------+-----------+

这是我想要返回的结果:

+---------+
| name    |
+---------+
| Kevin   |
| Kyle    |
+---------+

只有那三个 parent。我不希望 David 或 Zack 在结果中,因为他们没有 grandchildren。

要得到所有盛大的parent,我可以简单地做:

SELECT name FROM people WHERE parent_id = 0

但我需要一个查询,该查询只能 select 个 parent id 为零且为 grandparents 的条目。

(http://sqlfiddle.com/#!9/b1a818/3)

我觉得你需要一个双自JOIN才能达到孙子级别:

SELECT DISTINCT p1.name 
FROM people AS p1
INNER JOIN people AS p2 ON p1.id = p2.parent_id
INNER JOIN people AS p3 ON p2.id = p3.parent_id
WHERE p1.parent_id = 0 

INNER JOINs 将过滤掉未达到父子层次结构下两个级别的所有记录。

Demo here