2012-04-03 97 views
2

我有一個模式,基本上是這樣的:MySQL的層次分組排序

CREATE TABLE `data` (
    `id` int(10) unsigned NOT NULL, 
    `title` text, 
    `type` tinyint(4), 
    `parent` int(10) 
) 

type場僅僅是一個枚舉,其中1是一個父類,和2個孩子的類型(實際上有許多類型,其中一些應該像父母一樣行事,一些像孩子一樣)。 parent字段表示一條記錄是另一條記錄的子節點。

我知道這可能不是我想要構建的查詢的理想選擇,但這是我必須使用的。

我想對數據進行排序和分組,以便父記錄按title排序,並且在每個父代下分組是根據title排序的子記錄。像這樣:

ID | title  |type |parent 
-------------------------------- 
4 | ParentA  | 1 | 
2 | ChildA  | 2 | 4 
5 | ChildB  | 2 | 4 
7 | ParentB  | 1 | 
9 | ChildC  | 2 | 7 
1 | ChildD  | 2 | 7 

** 編輯 **

我們應該能夠採取type場出來的圖片完全。如果parent不爲空,那麼它應該被分組在它的父代下面。

+2

這是一個2級層次結構還是任意深度的樹? – 2012-04-03 20:14:18

+0

@Eric,只是一個簡單的2層次的層次結構 – ack 2012-04-03 20:16:14

回答

2
SELECT * FROM `data` ORDER BY COALESCE(`parent`, `id`), `parent`, `id` 
+0

這似乎很好,乾淨...我不認爲通過'title'要求排序可以工作到ORDER BY子句中嗎? – ack 2012-04-03 21:34:58

+0

得到這個工作,感謝領先! 'ORDER BY COALESCE(IF(parentID,parentTitle,NULL),IF(ID,title,NULL)),parentID,title' - 適用於我的實際查詢,因爲我有一個連接,它給了我'parentTitle',我可以然後在需要時換入COALESCE。 – ack 2012-04-03 22:17:57

+0

對不起,我沒有注意到「標題」要求。 – Neil 2012-04-04 23:35:57

0

以下是經過測試可在SQL Server上運行的解決方案。應該是基本相同的關於MySQL

select Id, Title, [Type], Id as OrderId from Hier h1 where [Type] = 1 
union 
select Id, Title, [Type], Parent as OrderId from Hier h2 where [Type] = 2 
order by OrderId, [Type] 
0

你說你想它來排序的冠軍,是否正確?

SELECT id, title, parent 
FROM 
    (SELECT id, title, parent, 
    CASE WHEN parent is null THEN title ELSE CONCAT((SELECT title FROM `data` d2 WHERE d2.id = d.parent), '.', d.title) END AS sortkey 
    FROM `data` d 
    ) subtable 
ORDER BY sortkey 

修改:編輯刪除查詢中的type

+0

對結果進行字符串連接和排序效率相當低。 – 2012-04-03 22:05:29