查询部门路径

Jul 17, 2019


查询思路是将 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