开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集。不同数据库中实现方式也不同,本文使用Mysql数据库,版本为8.0
- -- 计算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');