【发布时间】:2015-07-10 08:01:36
【问题描述】:
这是another question I just asked 的扩展。我在那里学习了如何正确编写 SQL 查询以获得所需的结果。但是当我尝试将它应用到我的实际使用中时,我发现了我需要的其他东西。
这是我所拥有的表格的简化版本:
+-----+-------------+-----------+
| 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 |
+----+-------------+-----------+
(自上一个问题以来,我又添加了一些,只是为了有更多示例)现在我希望能够获得父母、孩子和孙子孙女的名单。以下是我发现的查询:
祖父母
SELECT name FROM people WHERE parent_id = 0
儿童
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
我正在为孩子们想办法,所以我暂时先离开其他人。上面针对儿童的查询给出了以下结果:
+---------+
| name |
+---------+
| John |
| Larry |
| Jason |
| Mildred |
| Amber |
| Devon |
| Alfred |
| Robert |
| Keith |
+---------+
这很好,但我需要先按字母顺序排列,首先是父母,然后是孩子。所以我在查询中添加了一个 ORDER BY:
SELECT c.name
FROM people p
JOIN people c ON c.parent_id = p.id
WHERE p.parent_id = 0
ORDER BY p.name, c.name
这给了我:
+---------+
| name |
+---------+
| Amber |
| Larry |
| Mildred |
| Devon |
| Jason |
| John |
| Alfred |
| Keith |
| Robert |
+---------+
很好。但现在的问题是,我也想将父母包括在这个列表中,就在他们孩子所在的位置上方。另外,我想用某种方式来显示结果是父母还是孩子。所以我在考虑另一个名为Rank 的列,它的值可以是1 或2,以表示父母或孩子。所以这就是我想要的结果:
+--------+------+
| name | rank |
+--------+------+
| Kevin | 1 |
| Amber | 2 |
| Larry | 2 |
| Mildred| 2 |
| Kyle | 1 |
| Devon | 2 |
| Jason | 2 |
| John | 2 |
| Zack | 1 |
| Alfred | 2 |
| Keith | 2 |
| Robert | 2 |
+--------+------+
这有意义吗?我可以使用什么查询来获得该结果?
【问题讨论】:
-
如果它适合您:在单独的列中显示子项旁边的父项会更容易。您只需添加“p.name as parent”即可获得结果。
-
您获取祖父母、子女和孙子女的三个查询示例清楚地展示了图结构的复杂性增长速度。出于这个原因,我强烈建议你看看像图数据库这样的技术,比如 neo4j
-
@NorbertvanNobelen 好的,谢谢。这样可行。但我还需要将父母包括在姓名列表中。我怎么能那样做?对于这些项目,在他们的“父母”列下,我可能只是希望它是“NULL”
-
你可以使用 UNION: SELECT {your children query}, 1 UNION {your parents query}, 2; 1,2 是你的等级,所以这里有多种解决问题的方法:)
-
在您的最后一个示例中,
Mable和Bob未列出。那是因为他们是孙子吗?