MySQL以分层结构返回所有记录
我有一个简单的分层表“Groups”,其中存储每个孩子的父id 我尝试使用以下查询查询表组的每个成员: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 =
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
太棒了-这很有效,我已经为此挣扎了一天了。漫不经心的:)请务必接受这个答案,如果它真的解决了你的问题,它将有助于你的批准率