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 的条目。
我觉得你需要一个双自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 JOIN
s 将过滤掉未达到父子层次结构下两个级别的所有记录。
昨天我问
不过,现在,我需要做点别的: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 的条目。
我觉得你需要一个双自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 JOIN
s 将过滤掉未达到父子层次结构下两个级别的所有记录。