mysql 无限极递归_mysql8 递归 实现无限极分类

本文介绍了如何使用MySQL8的递归查询功能来高效地实现无限级分类,对比了传统代码层递归查询的方法,展示了性能提升的巨大优势。通过创建递归公共表表达式(CTE),实现了查询指定ID的所有父类和子类,以及包含本类的查询示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据id 查询所有的父类或者子类(不包含本类)

之前实现无限极分类用的是在代码层实现递归查询,听说mysql8 对递归查询很友好,正好遇到这个功能,就网上搜资料实现了一个简单的功能,确实性能很好,由之前的0.4秒提升到 0.01秒左右

实现的效果 :

14fb8275de894f99c0735ea7c8029d8a.png

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for digui

-- ----------------------------

DROP TABLE IF EXISTS `digui`;

CREATE TABLE `digui` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,

`pid` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------

-- Records of digui

-- ----------------------------

INSERT INTO `digui` VALUES ('1', '手机', '0');

INSERT INTO `digui` VALUES ('2', '电脑', '0');

INSERT INTO `digui` VALUES ('3', '家居', '0');

INSERT INTO `digui` VALUES ('4', '美妆', '0');

INSERT INTO `digui` VALUES ('5', '运营商', '1');

INSERT INTO `digui` VALUES ('6', '数码', '5');

INSERT INTO `digui` VALUES ('7', '办公', '2');

INSERT INTO `digui` VALUES ('8', '家具', '3');

INSERT INTO `digui` VALUES ('9', '家装', '8');

INSERT INTO `digui` VALUES ('10', '厨具', '9');

INSERT INTO `digui` VALUES ('11', '个护清洁', '4');

INSERT INTO `digui` VALUES ('12', '宠物', '4');

INSERT INTO `digui` VALUES ('13', '存储卡', '6');

INSERT INTO `digui` VALUES ('14', '三脚架', '6');

INSERT INTO `digui` VALUES ('15', '家纺', '3');

INSERT INTO `digui` VALUES ('16', '收纳用品', '3');

-- 查询所有子类

WITH RECURSIVE type_cte AS (

SELECT * FROM digui WHERE pid = 3

UNION ALL SELECT t.* FROM digui t INNER JOIN type_cte type_cte2 ON t.pid = type_cte2.id

) SELECT id,name,pid FROMtype_cte ORDER BY id ASC;

-- 查询所有父类

WITH RECURSIVE type_cte AS (

SELECT * FROM digui WHERE id = 8

UNION ALL SELECT t.* FROM digui t INNER JOIN type_cte type_cte2 ON t.id = type_cte2.pid

) SELECT id,name,pid FROMtype_cte ORDER BY id ASC

tp: 查询父类或子类(包含本类)

echo '递归

';

echo '

所有子类

';

$res = Db::query('WITH RECURSIVE type_cte AS (

SELECT * FROM digui WHERE id = ?

UNION ALL SELECT t.* FROM digui t INNER JOIN type_cte type_cte2 ON t.pid = type_cte2.id

) SELECT id,name FROM type_cte order by id asc',[5]);

$ids = array_column($res,'id');

dump($res);

echo '所有父类

';

$res = Db::query('WITH RECURSIVE type_cte AS (

SELECT * FROM digui WHERE id = ?

UNION ALL SELECT t.* FROM digui t INNER JOIN type_cte type_cte2 ON t.id = type_cte2.pid

) SELECT id,name FROM type_cte order by id asc ',[5]);

$anmes = array_column($res,'name');

$anmes = implode('/',$anmes);

dump($anmes);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值