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的去掉,因为这部分是没有关联的

在这里插入图片描述

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


版权声明:本文为weixin_44967580原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。