Mysql8.0递归查询的简单用法代码示例

作者:袖梨 2022-06-29

本篇文章小编给大家分享一下Mysql8.0递归查询的简单用法代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

Mysql8.0递归查询用法

表数据如下

+--------+----------+------------+

| cat_id | name | parent_cid |

+--------+----------+------------+

| 12 | 美妆 | 0 |

| 4 | 服装 | 0 |

| 5 | 女装 | 4 |

| 6 | 男装 | 4 |

| 7 | 童装 | 4 |

| 19 | 美容美体 | 12 |

| 18 | 彩妆 | 12 |

| 13 | 护肤 | 12 |

| 15 | 护肤套装 | 13 |

| 40 | 防晒 | 13 |

| 39 | 卸妆 | 13 |

| 38 | 润唇膏 | 13 |

| 17 | 乳液面霜 | 13 |

| 16 | 面膜 | 13 |

| 14 | 化妆水 | 13 |

+--------+----------+------------+

1. 我们需要查询出"服装"分类下的所有子分类

with recursive type_cte as (
    select *  from t_category  where cat_id = 4
    union all
    select t.* from t_category t
                        inner join type_cte type_cte2 on t.parent_cid = type_cte2.cat_id
)
select
    cat_id, name, parent_cid
from type_cte

+--------+------+------------+

| cat_id | name | parent_cid |

+--------+------+------------+

| 4 | 服装 | 0 |

| 5 | 女装 | 4 |

| 6 | 男装 | 4 |

| 7 | 童装 | 4 |

+--------+------+------------+

2. 查询出所有“美妆”分类下的所有子分类,并且分类名称带上上级分类的名称

with recursive type_cte as (
    select cat_id,name,parent_cid  from t_category  where cat_id = 12
    union all
    select t.cat_id,concat(type_cte2.name,'>',t.name),t.parent_cid 
    from t_category t
        inner join type_cte type_cte2 on t.parent_cid = type_cte2.cat_id
)
select
    cat_id, name, parent_cid
from type_cte;

+--------+------------------------+------------+

| cat_id | name | parent_cid |

+--------+------------------------+------------+

| 12 | 美妆 | 0 |

| 13 | 美妆>护肤 | 12 |

| 18 | 美妆>彩妆 | 12 |

| 19 | 美妆>美容美体 | 12 |

| 14 | 美妆>护肤>化妆水 | 13 |

| 15 | 美妆>护肤>护肤套装 | 13 |

| 16 | 美妆>护肤>面膜 | 13 |

| 17 | 美妆>护肤>乳液面霜 | 13 |

| 35 | 美妆>护肤>洁面 | 13 |

| 36 | 美妆>护肤>精华 | 13 |

| 37 | 美妆>护肤>眼霜 | 13 |

| 38 | 美妆>护肤>润唇膏 | 13 |

| 39 | 美妆>护肤>卸妆 | 13 |

| 40 | 美妆>护肤>防晒 | 13 |

+--------+------------------------+------------+

3. 查询分类的所有父级分类

根据第二个问题的sql做一下调整即可

with recursive type_cte as (
    select cat_id,name,parent_cid  from t_category  where cat_id = 40
    union all
    select t.cat_id,concat(type_cte2.name,'>',t.name),t.parent_cid
    from t_category t
             inner join type_cte type_cte2 on t.cat_id = type_cte2.parent_cid
)
select
    cat_id, name, parent_cid
from type_cte;

+--------+----------------+------------+

| cat_id | name | parent_cid |

+--------+----------------+------------+

| 40 | 防晒 | 13 |

| 13 | 防晒>护肤 | 12 |

| 12 | 防晒>护肤>美妆 | 0 |

+--------+----------------+------------+

相关文章

精彩推荐