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

前言

本文使用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 |
+--------+----------------+------------+

总结

到此这篇关于Mysql8.0递归查询的文章就介绍到这了,更多相关Mysql8.0递归查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL通过自定义函数实现递归查询父级ID或者子级ID

    背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无法控制或者是知道树的深度的.这时就需要在MySQL中用存储过程(函数)来实现或者在程序中使用递归来实现.本文讨论在MySQL中使用函数来实现的方法: 一.环境准备 1.建表 CREATE TABLE `table_name` ( `id` int(11) NOT NULL AUTO_INCREMEN

  • Mysql树形递归查询的实现方法

    前言 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造. Oracle递归查询 oracle实现递归查询的话,就可以使用start with ... connect by connect by递归查询基本语法是: select 1 from 表格 st

  • MySQL递归查询树状表的子节点、父节点具体实现

    简介:mysql5.0.94版本,该版本以及较高级的版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算是照搬了,父节点查询是逆思维弄的. 表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段(对应该记录的父节点,当然,一个父节点自然会有一个以上的子节点嘛) 复制代码 代码如下: CREATE FUNCTION `g

  • MySql8 WITH RECURSIVE递归查询父子集的方法

    背景 开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集.不同数据库中实现方式也不同,本文使用Mysql数据库,版本为8.0 Oracle数据库中可使用START [Param] CONNECT BY PRIOR Mysql 中需要使用 WITH RECURSIVE 需求 找到name为张三的孩子和孙子,pid为当前记录的父id,如张三儿子的pid为张三的id,以此类推. 引入 计算1到100的累加的结果. WITH RECURSIVE t(n) AS ( //t为我们结果表,n为字段,

  • SQL如何实现MYSQL的递归查询

    众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的.这个得益于Mysql允许在SQL语句内使用@变量.以下是示例代码. 创建表格 CREATE TABLE `treenodes` ( `id` int , -- 节点ID `nodename` varchar (60), -- 节点名称 `pid` int -- 节点父ID ); 插入测试数据 INSERT INTO `treenodes` (`id`, `nodenam

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

    前言 本文使用Mysql8.0的特新实现递归查询,文中给出了详细的实例代码,下面话不多说了,来一起看看详细的介绍吧 Mysql8.0递归查询用法 表数据如下 +--------+----------+------------+ | cat_id | name     | parent_cid | +--------+----------+------------+ |     12 | 美妆     |          0 | |      4 | 服装     |          0 |

  • MySQL8.0中的窗口函数的示例代码

    目录 1.窗口函数与聚合函数 2.常见的窗口函数 3.over子句 4.代码示例 4.1row_number\dense_rank\ rank 4.2cume_dist\percent_rank 4.3first_value\last_value\nth_value 4.4ntile() 4.5lag\lead 4.6聚合函数 4.7orderby子句 4.8 window子句 4.9 rows和range 在以前的MySQL版本中是没有窗口函数的,直到MySQL8.0才引入了窗口函数.窗口函数

  • Android开发中ProgressDialog简单用法示例

    本文实例讲述了Android开发中ProgressDialog简单用法.分享给大家供大家参考,具体如下: 网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主要的Activity ProgressBarDemo.java package com.lveyo.android.demo.progressbar; import android.app.Ac

  • 微信小程序picker组件简单用法示例【附demo源码下载】

    本文实例讲述了微信小程序picker组件简单用法.分享给大家供大家参考,具体如下: picker滚动选择器,现支持三种选择器,通过mode来区分,分别是普通选择器(mode=selector),时间选择器(mode=time),日期选择器(mode=date),默认是普通选择器. 具体功能说明如下: 普通选择器:mode=selector 属性名 类型 默认值 说明 range Array [] mode为selector时,range有效 value Number 0 mode为selecto

  • jQuery中内容过滤器简单用法示例

    本文实例讲述了jQuery中内容过滤器简单用法.分享给大家供大家参考,具体如下: 一 介绍 内容过滤器就是通过DOM元素包含的文本内容以及是否含有匹配的元素进行筛选.内容过滤器共包括:contains(text).:empty.:has(selector)和:parent4种,如下表所示. 过滤器 说明 示例 contains(text) 匹配包含给定文本的元素 $("li:contains('DOM')")    //匹配含有"DOM"文本内容的li元素 :emp

  • JS弹出窗口插件zDialog简单用法示例

    本文实例讲述了JS弹出窗口插件zDialog简单用法.分享给大家供大家参考,具体如下: 因为没有元素可以显示到Frameset上面去,所以重新定义了,一个index.htm,对其的操作是: Index.htm <script language="javascript" src="JS/zDialog/zDialog.js" type="text/javascript"></script> <script langua

  • yii2.0实现创建简单widgets示例

    本文实例讲述了yii2.0实现创建简单widgets的方法.分享给大家供大家参考,具体如下: namespace yii\widgets; use yii\base\Widget; use yii\helpers\Html; class HelloWidget extends Widget { public $message; public function init() { parent::init(); if ($this->message === null) { $this->messa

  • Android RadioGroup和RadioButton控件简单用法示例

    本文实例讲述了Android RadioGroup和RadioButton控件简单用法.分享给大家供大家参考,具体如下: RadioGroup和RadioButton代表的是Android中单选按钮的一种控件,写个简单的代码熟悉一下: import android.app.Activity; import android.os.Bundle; import android.widget.RadioButton; import android.widget.RadioGroup; import a

  • JS回调函数简单用法示例

    本文实例讲述了JS回调函数简单用法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>testCallBack.html</title> </head> <body> <

  • C# xmlSerializer简单用法示例

    本文实例讲述了C# xmlSerializer简单用法.分享给大家供大家参考,具体如下: 先上实体类 public class Entity { public Entity() { } public Entity(string c, string f) { name = c; school = f; } public string name; public string school; } 使用时声明 List<Entity> entityList=null; XmlSerializer xs

随机推荐