MySQL - WITH RECURSIVE AS 递归查询

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - WITH RECURSIVE AS 递归查询相关的知识,希望对你有一定的参考价值。

开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集。不同数据库中实现方式也不同,本文使用mysql数据库,版本为8.0

  • Oracle数据库中可使用START [Param] CONNECT BY PRIOR
  • Mysql 中需要使用 WITH RECURSIVE

抛砖引玉

-- 计算1到100的累加的结果
WITH RECURSIVE t(n) AS ( -- t 为我们结果表,n 为字段,可以只指定表名不指定字段
	SELECT 1 n -- 递归的开始,此时可理解为 t 表字段 n 只有一条记录 1
	UNION ALL
	SELECT n + 1 FROM t WHERE n < 100

   /* 这里产生的结果为 2  ,此时 t 表的字段 n 有两条记录分别为 1,2
    *				  3
    *                ...
    *                100
    */	
)

SELECT SUM(n) FROM t;

元素据

为了方便大家验证,提前准备好表结构和逻辑数据

/*
Navicat MySQL Data Transfer

Source Server         : MySQL
Source Server Version : 50720
Source Host           : localhost:3306
Source Database       : db_demo

Target Server Type    : MYSQL
Target Server Version : 50720
File Encoding         : 65001

Date: 2021-11-25 18:46:10
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t_family
-- ----------------------------
DROP TABLE IF EXISTS `t_family`;
CREATE TABLE `t_family` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `pid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_family
-- ----------------------------
INSERT INTO `t_family` VALUES ('1', '王五', '0');
INSERT INTO `t_family` VALUES ('2', '王五儿子', '1');
INSERT INTO `t_family` VALUES ('3', '王五孙子', '2');
INSERT INTO `t_family` VALUES ('4', '赵六', '0');
INSERT INTO `t_family` VALUES ('5', '赵六儿子', '4');
INSERT INTO `t_family` VALUES ('6', '赵六孙子', '5');

以上是关于MySQL - WITH RECURSIVE AS 递归查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - WITH RECURSIVE AS 递归查询

mysql 递归函数with recursive的用法

mysql with recursive 递归用法

mysql with recursive 递归用法

mysql with recursive 递归用法

MYSQL8.0 WITH RECURSIVE递归查询