2015-10-20 73 views
1

我想和這個參考MySQL的樹從路徑

+----+--------------+----------------+ 
| id | name  | Path   | 
| 751| ledger 1  | 751/   | 
| 752| l sub  | 751/752/  | 
| 753| l sub1.2  | 751/752/753/ | 
| 754| l sub2  | 751/754/  | 
| 756| l Sub1.3  | 751/752/756/ | 
| 757| l Sub2.1  | 751/754/757/ | 
+----+--------------+----------------+ 

我需要的只是答案

ledger 1 
    l sub 
     l sub1.2 
     L Sub1.3 
    l sub2 
     l Sub2.1 
+0

我嘗試很多..但負... –

回答

2

你可以用名稱前串聯空間嘗試顯示MySQL中的樹形結構:

SELECT 
    CASE LENGTH(Path) - LENGTH(REPLACE(Path, '/', '')) 
    WHEN 2 THEN CONCAT(' ', name) 
    WHEN 3 THEN CONCAT('  ', name) 
    WHEN 4 THEN CONCAT('   ', name) 
    WHEN 5 THEN CONCAT('   ', name) 
    WHEN 6 THEN CONCAT('    ', name) 
    -- ... to max depth 
    ELSE name 
    END AS result 
FROM tab 
ORDER BY path; 

SqlFiddleDemo

編輯:

使用REPEAT

SELECT 
    CASE 
    WHEN LENGTH(Path) - LENGTH(REPLACE(Path, '/', '')) > 1 
    THEN CONCAT(REPEAT(' ', LENGTH(Path) - LENGTH(REPLACE(Path, '/', ''))-1),name) 
    ELSE name 
    END AS result 
FROM tab 
ORDER BY path; 

SqlFiddleDemo

另一種方法(如@Mchl評論中提出)是計算DEPTH做formattin克應用:

SELECT *, 
    LENGTH(Path) - LENGTH(REPLACE(Path, '/', '')) AS depth 
FROM tab 
ORDER BY path; 
+0

它不是完全發揮作用。如果名稱是一些什麼長度大,結果名字是不是沒有全名 –

+0

@UshanTennakoon嘗試更新 – lad2025

+0

認真:爲什麼不選擇深度作爲數字,並在獲取此數據的應用程序中執行所有格式化? – Mchl