mysql递归查询所有子级

发布时间: 2023-11-21 10:54 阅读: 文章来源:1MUMB473PS

查所有子级这样的需求很常见,在Oracle我们可以使用 start with connect by prior语法来查找所有子级。下边是简单例子

select * from t_test s start with s.parent_id = ‘46546546465‘connect by prior s.tree_id = s.parent_id

那么在mysql中该如何查找呢?

Mysql8以上版本可以使用WITH RECURSIVE语法进行递归查询,可以轻松查找指定父级下所有子级。Mysql8以下版本并没有相应的语法或方法来进行递归查询,那么我们可以使用存储过程、自连接+变量等方式,今天来说说使用自连接+变量来查找指定父级下所有子级。

--不包含指定id自身select * FROM(select * FROM PRODUCT where PID > 0 ORDER BY PID, PRODUCT_ID DESC) sorted,(select @pv :=3409) initWHERE (FIND_IN_SET(PID,@pv)>0 And @pv := concat(@pv, ‘,‘, PRODUCT_ID))

原理:

可以将这个sql拆开成两部分来看第一部分:

select * FROM(select * FROM PRODUCT where PID > 0 ORDER BY PID, PRODUCT_ID DESC) sorted,(select @pv :=3409) init

查询结果:

第二部分就是where条件

WHERE (FIND_IN_SET(PID,@pv)>0 And @pv := concat(@pv, ‘,‘, PRODUCT_ID))

解读:每条数据依次判断pid在@pv中是否存在,如果FIND_IN_SET(PID,@pv)>0,证明存在,那么将此时pid对应的数据返回,判断为null或等于0,则证明不存在,那么这条数据就不会被返回,之后再将此条数据的id放进@pv中。

您的赞和关注是对我最大的肯定,希望大家多多支持,谢谢大家。

•••展开全文
相关文章