SQL查询仅选择具有孙子的条目

时间:2015-07-10 21:55:11

标签: mysql sql

昨天我问this question关于只选择孙子条目的问题。我花了一段时间,但我终于想出了如何做我想做的事。

现在,我需要做一些其他的事情:只选择祖父母的条目(“祖父母”,我的意思是没有父母的人,即他们的parent_id是0),但只有那些有孙子的人,不管他们是否有孩子。

这是我的表格:

+-----+-------------+-----------+
| 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    |
+---------+
只有那三个父母。我不希望David或Zack成为结果,因为他们没有孙子。

为了得到所有的祖父母,我可以这样做:

SELECT name FROM people WHERE parent_id = 0

但我需要一个只能选择父ID为零并且是祖父母的条目的查询。

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

1 个答案:

答案 0 :(得分:1)

我认为你需要一个双重自我 - 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将过滤掉不会在父子层级中达到两级的任何记录。

Demo here