2015-10-20 109 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