如何编写一个 MYSQL 查询,该查询将返回嵌套在父级下的子项


How to write a MYSQL query that will return children nested under parents?

我不知道我问的是否可能,但这是我的情况。我有一个结构有点像这样的表格:

+--------------------------------------------------+
|   id   |   parent_id   |   name   |   category   | ....
+--------------------------------------------------+
|    0   |       -1      |   item0  |      1       |
|    1   |        0      |   item1  |      1       |
|    2   |        0      |   item2  |      1       |
|    3   |        2      |   item3  |      1       | 
|    4   |        2      |   item4  |      1       | 
|    5   |       -1      |   item5  |      1       | 
+--------------------------------------------------+

parent_id -1 表示它是没有父项的"基本"项。每个项目将包含更多信息列。我需要以某种方式输出嵌套类别中的所有项目,如下所示:

item0 => item1    
      => item2
            => item3
            => item4  
item5  

我不知道这是否有意义,但希望有意义!

我能想到的唯一方法是进行查询以获取所有"基"项(查询 parent_id = -1 的行),然后遍历每个结果行,查询其parent_id等于当前行 id 的行,然后越来越深入地重复该过程,直到基项没有更多的子项。

有没有更好的方法?

谢谢!!

这在纯SQL中是不可能的。

SQL 旨在处理关系数据而不是树(分层数据)。

您可以在 SQL 架构中表示树,但是您将无法像预期的那样生成树。

唯一的方法是通过使尽可能多的加入与您存储的级别一样多来获得可用的结果。

您当前的架构可能支持多个级别,但是,管理多个或两个级别将非常困难。

您可能对嵌套集模型或管理mysql中的分层数据感兴趣

有一些像这样的嵌套集的实现,可以与原则 2 一起使用

这在纯SQL中是不可能的,它是关系模型中引起最多批评的方面之一。

我建议您阅读这篇文章中的链接: SQL"树状"查询 - 大多数父组

而且,如果你的应用程序过于依赖这一点,我建议你看看一些可以更好地表示这种数据的非关系数据库,比如MongoDB(www.mongodb.org)。

我希望

我能很好地理解你的问题(这里已经很晚了,我刚从酒吧来),如果我没有,只要纠正我,我会重写我的答案。

从给出的场景中,我想还有另一个父表,不是吗?

让我们想象一下它的属性是 id 和名称。子表是您给定的表(没有不必要的属性)。

mysql> insert into parent(name) values ('petr'),('tomas'),('richard');

mysql> insert into children(name,parent_id) values('michal',1),('tomas',1),('michal');

mysql> select parent.id,parent.name,children.name from parent left join children on parent.id = children.parent_id;
+----+---------+--------+
| id | name    | name   |
+----+---------+--------+
|  1 | petr    | michal |
|  1 | petr    | tomas  |
|  2 | tomas   | NULL   |
|  3 | richard | michal |
+----+---------+--------+

为了多次这样做(父母有孩子谁得到孩子谁得到孩子等)可以通过使用多个联接来实现此目的。

mysql> select parent.id,parent.name as Parent,children.name as Child,children2.name as Child2 from parent left join children on parent.id = children.parent_id left join children2 on children.id = children2.parent_id;
+----+---------+--------+--------+
| id | Parent  | Child  | Child2 |
+----+---------+--------+--------+
|  1 | petr    | michal | NULL   |
|  1 | petr    | tomas  | dan    |
|  1 | petr    | tomas  | pavel  |
|  2 | tomas   | NULL   | NULL   |
|  3 | richard | michal | michal |
+----+---------+--------+--------+

如果我没有回答您的问题,或者您需要进一步解释,请告诉我;]

问候

雷莱斯