今天有个业务是选定区域名,表结构如下,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的去掉,因为这部分是没有关联的

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

被折叠的 条评论
为什么被折叠?



