2013-04-18 26 views
0

我有一个简单的层次表'Groups',其中存储每个子项的父代ID。MySQL返回分层结构中的所有记录

我想查询与下面的查询表组的每个成员:

SELECT groups.name AS 'Group Name', 
     groups1.name AS 'Group1 Name' 
FROM groups 
     LEFT JOIN groups groups1 
       ON groups.id = groups1.parent_id 
WHERE groups.parent_id = 0 
ORDER BY groups.id, 
      groups1.id 

和我越来越:

|集团名称......... ............................. |组1名称............ |
| ----------------------------------------------- --------------------------- |
|资产.............................................. 。|固定资产.............. |
|资产.............................................. 。|流动资产.......... |
|资产.............................................. 。|投资............... |
|负债和所有者权益............ |资本账户......... |
|负债和所有者权益............ |流动负债...... |
|收入............................................ |直接收入........... |

但我真正想要的是即使有一个孩子,即每个节点一行:

|集团名称................. ..................... |组1名称............ |
| ----------------------------------------------- --------------------------- |
|资产.............................................. 。| .................................. |
|资产.............................................. 。|固定资产.............. |
|资产.............................................. 。|流动资产.......... |
|资产.............................................. 。|投资............... |
|负债和所有者权益............ | .............................. ...... |
|负债和所有者权益............ |资本账户......... |
|负债和所有者权益............ |流动负债...... |
|收入............................................ |。 ................................. |
|收入............................................ |直接收入........... |

有什么办法可以用查询或查询做到这一点吗?

回答

0

而不是将顶层条目的parent_id设置为0,请将parent_id设置为自身(即,parent_id = id)。然后加入顶级的所有“孩子”,这将包括自己。

SELECT parent.name AS `Group Name`, 
    IF(parent.id = child.id, '', child.name) AS `Group1 Name` 
FROM groups AS parent JOIN groups AS child 
    ON ((parent.id = child.parent_id))) 
WHERE parent.parent_id = parent.id 
ORDER BY parent.id, child.id 

注意你不需要LEFT OUTER JOIN,因为有保证至少有一个“孩子”。

您也可以使用我已经在一些岗位上的堆栈溢出所描述的封闭表设计:

0

这里有一个方法,让你一些额外的领域,但它需要这样做是为了正确地排列结果。如果您希望清理一下输出,您可以在技术上围绕此选择的输出进行另一个选择。

(
    SELECT groups.id AS parent_id, groups1.id AS child_id, groups.name AS 'Group Name', 
     IF(LENGTH(groups1.name), groups1.name, '') AS 'Group1 Name' 
    FROM groups 
    LEFT JOIN groups groups1 ON groups.id = groups1.parent_id 
    WHERE groups.parent_id = 0 
) 
UNION 
(
    SELECT groups.id AS parent_id, NULL AS child_id, groups.name AS 'Group Name', '' AS 'Group1 Name' FROM groups WHERE groups.parent_id = 0 
) 
ORDER BY parent_id, child_id 
+0

精湛 - 这伟大工程,我一直在与挣扎天 – user2296222

+0

精彩:)请务必接受这个作为答案,如果它确实解决你的问题,它会帮助你的审批速度 – Bryan