mysql 遍历 父子_mysql实现父子递归查询sql

在很多业务场景中,我们需要从数据库查询一些树状结构的数据,多半以id,pid的形式存储记录。

在Oracle中,能够通过语法轻松实现父子级间的递归查询,无论到父,子,孙,曾孙等多少级,都能查出来。

但是在mysql中,就没有像Oracle中那样有现成的语法直接调用了。

本篇文章里,我将带大家了解一种在sql中设置参数来进行递归查询的方法,如下:

设表test有以下字段:id,name,pid;

id

name

pid

1

父亲

0

2

儿子

1

3

孙子

2

4

曾孙

3

5

伯伯

0

我们可以使用以下语法进行查询(假设知道儿子的id):

SELECT * FROM test

WHERE id IN(

SELECT id FROM

(

SELECT id,pid FROM test WHERE pid> 0 ORDER BY pid, id DESC

) t1,

(SELECT @pv := 2) t2

WHERE (FIND_IN_SET(pid,@pv)>0 AND @pv := CONCAT(@pv, ',', id)

)

)

UNION

SELECT * FROM test WHERE id = 2

以上语法@pv:=2表示在sql中使用pv做一个临时的变量,存储后端传过来的参数,在后面的sql中可以随意使用这个变量。

find_in_set(a,b)语法表示在b集合中【结构为(1,2,3)这样的】这样的结构中查询有a的记录,返回这个记录。

上述语法的解释就是:

1. 查询test表里所有非父类的集合,作为in的筛选集合t1;

2. 设置临时变量pv = 传过来的id值:2;

3. 遍历筛选t1中pid等于变量pv值2的记录,同时还要把这个符合的记录拼接进变量pv里,假设当前遍历查询到符合条件的记录id为3,那这轮轮询后pv的值变成了“2,3”了;

4. 按照3的步骤一直轮询,最后递归查出父id为2的所有子孙后代的id集合;

5. 查询test表中id在这些id集合的数据,最后union上父亲本身。

最后查出结果为:

id

name

pid

1

父亲

0

2

儿子

1

3

孙子

2

4

曾孙

3

欢迎大家转载!

你可能感兴趣的:(mysql,遍历,父子)