MySQL以分层结构返回所有记录

MySQL以分层结构返回所有记录,mysql,hierarchical-data,Mysql,Hierarchical Data,我有一个简单的分层表“Groups”,其中存储每个孩子的父id 我尝试使用以下查询查询表组的每个成员: 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 =

我有一个简单的分层表“Groups”,其中存储每个孩子的父id

我尝试使用以下查询查询表组的每个成员:

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名称………|
|--------------------------------------------------------------------------|
|资产 |资产固定资产 |资产流动资产 |资产投资 |负债和所有者权益 |负债和所有者权益资本账户 |负债和所有者权益…………|流动负债……|
|收入 |收入直接收入


对于一个或多个查询,有什么方法可以做到这一点吗?

对于顶级条目,不要将parent\u id设置为0,而是将parent\u id设置为自身(即parent\u 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
注意,您不需要左外部联接,因为保证至少有一个“子级”

您还可以使用我在几篇关于堆栈溢出的文章中描述的闭包表设计:


这里有一种方法可以为您提供一些额外的字段,但它需要这样做才能正确排序结果。如果您想稍微清理一下输出,您可以在技术上围绕此选择的输出包装另一个选择

(
    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

太棒了-这很有效,我已经为此挣扎了一天了。漫不经心的:)请务必接受这个答案,如果它真的解决了你的问题,它将有助于你的批准率