0

我有一个简单的分层表“组”,我在其中存储每个孩子的父 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 名称...... ......|
|------------------------------------------------- --------------------------|
|资产..................................................| .....................|
|资产..................................................|固定资产…………|
|资产..................................................|流动资产............|
|资产..................................................|投资........|
|负债和所有者权益…………|……………… ....|
|负债与所有者权益…………|资本账户…………|
|负债和所有者权益…………|流动负债……|
|收入..................................................|... ................................|
|收入................................................|直接收入。 ..........|

有没有办法通过一个或多个查询来做到这一点?

4

2 回答 2

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,因为保证至少有一个“孩子”。

您还可以使用我在 Stack Overflow 上的几篇文章中描述的 Closure Table 设计:

于 2013-04-18T19:01:51.987 回答
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
于 2013-04-18T19:10:29.100 回答