Mysql 多级菜单/路径/分类中 id 路径转中文name 路径,Sql实现非递归,循环

需求:

设计数据库时为避免递归多级菜单/部门等常会带上id_path,如
在这里插入图片描述
不通过代码查询直接获取name_path,使用 FIND_IN_SET()+ GROUP_CONCAT:

SELECT a.*, GROUP_CONCAT(b.name ORDER BY b.id_path) AS name_path
FROM table a 
LEFT JOIN table b ON FIND_IN_SET( b.id, a.id_path)
GROUP BY a.id

在这里插入图片描述

示例:

已有的库格式无法匹配时需进行转换在这里插入图片描述
表中dept_path是以‘/’分割的,且第一个id带有分割符
截取替换:(REPLACE (SUBSTR(department_path,2),’/’,’,’))得到:
在这里插入图片描述
完整sql:
SELECT a.department_id, REPLACE (GROUP_CONCAT(b.department_name ORDER BY b.department_path),',','/') AS name_path FROM t_department a LEFT JOIN t_department b ON FIND_IN_SET(b.department_id,(REPLACE (SUBSTR(a.department_path,2),'/',','))) GROUP BY a.department_id

效果:

在这里插入图片描述

补充:

GROUP_CONCAT:分组连接字段,默认分隔符为’,’,内部进行排序使路径由高到低;
结尾可使用having进行筛选+HAVING department_id = #{dept_id}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值