2013-07-02 26 views
0

我已經實現了使用MySQL如何檢索檢索作爲一個集合

1 
|----- 2 
|----- 3 

4 
|----- 5 
|----- 6 
     |----- 7 



id  | path  | level | parent_id | content | 
------------------------------------------------------------------- 
1    1    1   NULL   xxx 
2   1:2   2   1    yyy 
3   1:3   2   1    abc 
4    4    1   NULL   zzz 
5   4:5   2   4    yyy 
6   4:6   2   4    abc 
7   4:6:7   3   6    abc 

以下分層數據分層數據假設我只有這些記錄, 如何取回他們在一個樹狀結構,但在一個單一的從最後一棵樹開始收集?

我從查詢期望什麼或存儲過程返回我下面的正是這個順序

id 
----- 

4 
5 
6 
7 
1 
2 
3 

我該怎麼做相同的,但開始的第一棵樹?

id 
----- 
1 
2 
3 
4 
5 
6 
7 
+0

可能是重複的:http://stackoverflow.com/questions/11064913/achieve-hierarchy-parent-child-relationship-in-an-effective-and-easy-way –

回答

0

嘗試,包括訂單的遞減

ORDER by path desc,id asc 
0

爲了應付父母/子女很可能是這樣的: -

SELECT PathTable.*, SUM(OrderVal) AS OrderCalc 
FROM 
(
    SELECT id, 
      POW(100, MaxDepth-i-1) * SUBSTRING_INDEX(SUBSTRING_INDEX(path, ':', (i+1)), ':', -1) AS OrderVal 
    FROM PathTable 
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Sub1 
    CROSS JOIN (SELECT MAX(LENGTH(path) - LENGTH(REPLACE(path, ':', ''))) + 1 AS MaxDepth FROM PathTable) Sub2 
    WHERE i <= (LENGTH(path) - LENGTH(REPLACE(path, ':', ''))) 
) Sub1 
INNER JOIN PathTable 
ON Sub1.id = PathTable.id 
GROUP BY PathTable.id 
ORDER BY OrderCalc 

這是分手了路徑領域和計算訂單價值基於100的路徑位的功率,考慮路徑的最大位數,該路徑的位(因此4:6:7登陸爲7 + 6 * 100^1 + 4 * 100^2),然後按順序排序。

100選擇正如它比路徑中的最大單值大。