我不知道我问的是否可能,但这是我的情况。我的表格有点像这样:
+--------------------------------------------------+
| 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,然后重复进程越来越深,直到基本项目没有更多的子项。
有更好的方法吗?
谢谢!
答案 0 :(得分:9)
在纯SQL中是不可能的。
SQL旨在处理关系数据而不是树(分层数据)。
您可以在SQL架构中表示树,但是您无法按照自己的意愿生成树。
唯一的方法是通过将尽可能多的连接作为存储级别来获得可用的结果。
您当前的架构可能支持多个级别,但是,管理多个级别或两个级别将非常困难。
您可能对Nested Set Model或Managing hierarchical data in mysql
感兴趣有一些嵌套集的实现,如this one,可以与Doctrine 2一起使用
答案 1 :(得分:1)
这在纯SQL中是不可能的,它是产生大多数批评的关系模型的一个方面。
我建议你阅读这篇文章的链接:SQL "tree-like" query - most parent group
而且,如果您的应用程序过分依赖于此,我建议您查看一些可以更好地表示此类数据的非关系数据库,例如MongoDB(www.mongodb.org)< / p>
答案 2 :(得分:1)
我希望我能很好地理解你的问题(这里已经很晚了,我只是来自酒吧),如果我没有,只要纠正我,我会改写我的答案。
根据给出的情景,我猜有另一个父表,不存在吗?
让我们想象它的属性是id和name。子表是您给定的一个(没有不必要的属性)。
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 |
+----+---------+--------+--------+
如果我要么没有回答你的问题,要么需要进一步的解释让我知道;]
此致
Releis