什么是MySQL遞歸查詢

遞歸查詢是一種允許數(shù)據(jù)庫從一個初始條件開始,反復(fù)調(diào)用自身的數(shù)據(jù)信息檢索技術(shù)。它在處理樹形結(jié)構(gòu)數(shù)據(jù),如組織架構(gòu)、目錄結(jié)構(gòu)和產(chǎn)品分類時尤為有用。MySQL自8.0版本開始支持CTE(Common Table Expression)遞歸查詢,這使得遞歸查詢的實(shí)現(xiàn)變得更加簡潔和高效。

遞歸查詢的應(yīng)用場景

遞歸查詢在各種應(yīng)用場景中都很常見,例如:

  1. 組織架構(gòu)查詢:獲取公司內(nèi)部的組織結(jié)構(gòu)信息,從CEO到普通員工的層級關(guān)系。
  2. 產(chǎn)品分類查詢:從頂級分類到子分類的層級查找。
  3. 目錄結(jié)構(gòu)查詢:在文件系統(tǒng)中,從根目錄到子目錄的路徑查找。

MySQL遞歸查詢的三種實(shí)現(xiàn)方式

下面將詳細(xì)介紹三種實(shí)現(xiàn)MySQL遞歸查詢的方法:創(chuàng)建自定義函數(shù)、使用純SQL和使用WITH RECURSIVE。

使用自定義函數(shù)實(shí)現(xiàn)遞歸查詢

自定義函數(shù)是一種傳統(tǒng)的遞歸實(shí)現(xiàn)方式,通過創(chuàng)建存儲過程或函數(shù)來實(shí)現(xiàn)遞歸查詢。

自定義函數(shù)的優(yōu)缺點(diǎn)

示例代碼

DELIMITER //
CREATE FUNCTION getChildRegions(parent_id INT) RETURNS VARCHAR(1000)
BEGIN
  DECLARE child_list VARCHAR(1000);
  SET child_list = '';
  SELECT GROUP_CONCAT(id) INTO child_list FROM sys_region WHERE parent_code = parent_id;
  RETURN child_list;
END//
DELIMITER ;

該函數(shù)通過遞歸調(diào)用自身獲取所有子節(jié)點(diǎn)的ID列表。

使用純SQL實(shí)現(xiàn)遞歸查詢

使用純SQL實(shí)現(xiàn)遞歸查詢不需要創(chuàng)建函數(shù),但需要通過多次JOIN操作來反復(fù)獲取數(shù)據(jù)。

優(yōu)缺點(diǎn)分析

示例代碼

SELECT T1.id, T1.name, T2.name AS parent_name
FROM sys_region T1
LEFT JOIN sys_region T2 ON T1.parent_code = T2.id;

該查詢通過JOIN操作獲取每個區(qū)域及其父區(qū)域的名稱。

使用WITH RECURSIVE實(shí)現(xiàn)遞歸查詢

MySQL 8.0以上版本支持WITH RECURSIVE語法,簡化了遞歸查詢的實(shí)現(xiàn)。

優(yōu)缺點(diǎn)分析

示例代碼

WITH RECURSIVE region_cte AS (
  SELECT id, name, parent_code FROM sys_region WHERE id = 1
  UNION ALL
  SELECT r.id, r.name, r.parent_code
  FROM sys_region r
  JOIN region_cte c ON r.parent_code = c.id
)
SELECT * FROM region_cte;

該代碼使用WITH RECURSIVE實(shí)現(xiàn)了從山東省開始的區(qū)域遞歸查詢。

實(shí)現(xiàn)步驟詳解

建表腳本

在實(shí)現(xiàn)遞歸查詢之前,我們需要創(chuàng)建示例數(shù)據(jù)表sys_region

創(chuàng)建表

DROP TABLE IF EXISTS sys_region;
CREATE TABLE sys_region  (
  id int(50) NOT NULL AUTO_INCREMENT COMMENT '地區(qū)主鍵編號',
  name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地區(qū)名稱',
  short_name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '簡稱',
  code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '行政地區(qū)編號',
  parent_code varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id',
  level int(2) NULL DEFAULT NULL COMMENT '1級:省、直轄市、自治區(qū)rn2級:地級市rn3級:市轄區(qū)、縣(旗)、縣級市、自治縣(自治旗)、特區(qū)、林區(qū)rn4級:鎮(zhèn)、鄉(xiāng)、民族鄉(xiāng)、縣轄區(qū)、街道rn5級:村、居委會',
  flag int(1) NULL DEFAULT NULL COMMENT '0:正常 1廢棄',
  PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 182 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '地區(qū)表' ROW_FORMAT = Dynamic;

插入數(shù)據(jù)

INSERT INTO sys_region VALUES (1, '山東省', '魯', '370000000000', NULL, 1, 0);
INSERT INTO sys_region VALUES (2, '濟(jì)南市', '濟(jì)南', '370100000000', '370000000000', 2, 0);
INSERT INTO sys_region VALUES (3, '市轄區(qū)', '市轄區(qū)', '370101000000', '370100000000', 3, 0);

FAQ

  1. 問:什么是MySQL遞歸查詢?

  2. 問:使用WITH RECURSIVE有什么優(yōu)勢?

  3. 問:遞歸查詢有哪些常見應(yīng)用場景?

通過對MySQL遞歸查詢?nèi)N實(shí)現(xiàn)方式的分析和實(shí)例演示,開發(fā)人員可以更有效地應(yīng)用遞歸查詢技術(shù),處理復(fù)雜的數(shù)據(jù)庫結(jié)構(gòu)問題。

上一篇:

PID 是什么:工作原理及其應(yīng)用

下一篇:

ARIMA中參數(shù)選擇及相關(guān)問題
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費(fèi)