6

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

+--------------------------------------------------+
|   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,然后重复这个过程越来越深,直到没有更多的子项作为基本项。

有没有更好的办法?

谢谢!!

4

3 回答 3

10

这在纯 SQL 中是不可能的。

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

您可以在 SQL 模式中表示树,但是您无法按照您的意图生成树。

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

您当前的模式可能支持多个级别,但是,管理超过一或两个级别将非常困难。

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

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

于 2012-06-19T22:34:27.830 回答
1

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

我建议您阅读这篇文章中的链接:SQL "tree-like" query - most parent group

而且,如果您的应用程序过于依赖于此,我建议您查看一些可以更好地表示此类数据的非关系型数据库,例如 MongoDB (www.mongodb.org)

于 2012-06-19T22:38:57.107 回答
1

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

从给出的场景来看,我猜还有另一个父表,不是吗?

让我们想象它的属性是 id 和 name。Children 表是您给定的(没有不必要的属性)。

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 |
+----+---------+--------+--------+

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

问候,

雷莱斯

于 2012-06-19T22:53:19.127 回答