2013-04-18 27 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