查询思路是将 tree_path
按照 -
拆分出每一个部门 id,然后用 id 关联部门,最后用GROUP_CONCAT
重新组装部门名称
其核心,即拆分方式,见这里
数据库内的数据如下所述:
dept_id dept_name dept_desc tree_path
1 测试 根部门 0000000000000000001-
721916316696657920 第一级1 第一级1 0000000000000000001-721916316696657920-
721916338855165952 第二级1 第二级1 0000000000000000001-721916316696657920-721916338855165952-
721916374276063232 第一级2 第一级2 0000000000000000001-721916374276063232-
730652393628450816 第三级1 第三级1 0000000000000000001-721916316696657920-721916338855165952-730652393628450816-
730652469063008256 第三级2 第三级2 0000000000000000001-721916316696657920-721916338855165952-730652469063008256-
查询SQL:
SELECT
M.dept_id,M.dept_name,GROUP_CONCAT( N.dept_name ORDER BY deptorder ASC SEPARATOR '/' ) AS dept
FROM
(
SELECT
dept_id,dept_name,SUBSTRING_INDEX( SUBSTRING_INDEX( d.tree_path, '-', h.help_topic_id + 1 ), '-',- 1 ) AS pid
FROM tb_department d
LEFT JOIN mysql.help_topic h ON h.help_topic_id < ( length( d.tree_path ) - LENGTH( REPLACE ( d.tree_path, '-', '' ) ) )
) M
LEFT JOIN ( SELECT dept_id, dept_name, LENGTH( tree_path ) AS deptorder FROM tb_department ) N ON M.pid = N.dept_id
GROUP BY M.dept_id,M.dept_name;
查询结果:
dept_id dept_name dept
1 测试 测试
721916316696657920 第一级1 测试/第一级1
721916338855165952 第二级1 测试/第一级1/第二级1
721916374276063232 第一级2 测试/第一级2
730652393628450816 第三级1 测试/第一级1/第二级1/第三级1
730652469063008256 第三级2 测试/第一级1/第二级1/第三级2