mysql递归查询省市区

今天有个业务是选定区域名,表结构如下,lz_pm_area是表名:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我想到两种方法,一种是在业务代码层进行递归,第二种是在mysql里进行递归查询,我选择了后者

sql语句如下:

SELECT c2.id,c2.pid,c2.area_name areaName,c2.area_type areaType FROM 
( SELECT t1.id,IF(FIND_IN_SET(t1.pid, @pids) > 0, @pids := CONCAT(@pids, ',', t1.id), 0) AS leafNodeId 
FROM (SELECT @pids := 7 ) xxx ,(SELECT id, pid FROM `lz_pm_area`) t1 ) 
c3 
INNER JOIN `lz_pm_area` c2 ON c2.id = c3.id 
WHERE c3.leafNodeId != 0 

对语句进行拆解分析:
在这里插入图片描述

这里是给变量pids赋值,后面的xxx不用理他,任意一个单词都可以

在这里插入图片描述

如果t1.pid在pids这个数组里的话,则将t1.id拼接在pids这个数组里,
不在的话置为0

这句看不懂可以去了解一下FIND_IN_SET函数,其实就是用来判断t1.pid是否在pids这个数组里

在这里插入图片描述

这是单独执行里面这句话的结果,可以看到leafNodeId这一列是包含左边的id的,否则为0

在这里插入图片描述

最后这部分就是将leafNodeId为0的去掉,因为这部分是没有关联的

在这里插入图片描述

这样我们就可以根据业务需求来进行递归查找了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值