在 MySQL 中計(jì)算層高受到遞歸查詢(Recursive Query)的支持。遞歸查詢可以用于處理一些層級(jí)關(guān)系的數(shù)據(jù),例如組織架構(gòu)、朋友關(guān)系等等。下面我們將詳細(xì)介紹如何利用遞歸查詢計(jì)算層高。
首先,我們需要先準(zhǔn)備一個(gè)測(cè)試數(shù)據(jù)表。例如,我們可以創(chuàng)建一個(gè)叫做“employee”的表,其中包含員工的編號(hào)、姓名和上級(jí)編號(hào)等信息。我們假設(shè)這是一個(gè)具有明確層級(jí)關(guān)系的表。
CREATE TABLE employee (id INT, name VARCHAR(20), parent_id INT); INSERT INTO employee VALUES (1, '張三', NULL), (2, '李四', 1), (3, '王五', 2), (4, '趙六', 2), (5, '錢(qián)七', 1), (6, '孫八', 5);
上面的 SQL 語(yǔ)句用于創(chuàng)建一個(gè)包含6名員工的表,其中“parent_id”字段表示上級(jí)員工的編號(hào),如果為NULL則表示該員工為根節(jié)點(diǎn)。
現(xiàn)在我們要計(jì)算每個(gè)員工的層高(即到根節(jié)點(diǎn)的距離)。我們可以使用以下 SQL 語(yǔ)句:
WITH RECURSIVE cte AS ( SELECT id, name, parent_id, 1 AS level FROM employee WHERE parent_id IS NULL UNION ALL SELECT e.id, e.name, e.parent_id, cte.level+1 AS level FROM employee e JOIN cte ON e.parent_id = cte.id ) SELECT id, name, level FROM cte;
上面的 SQL 語(yǔ)句使用了 WITH RECURSIVE 聲明一個(gè)遞歸查詢,并且定義了一個(gè)叫做“cte”的臨時(shí)表,包含員工的編號(hào)、姓名、上級(jí)編號(hào)和層級(jí)等信息。在第一次查詢時(shí),我們選擇了“parent_id IS NULL”的員工作為起點(diǎn),即根節(jié)點(diǎn)。
接下來(lái)使用 UNION ALL 將當(dāng)前層級(jí)的員工和下一層級(jí)的員工合并為一個(gè)數(shù)據(jù)集。JOIN cte ON e.parent_id = cte.id 表示當(dāng)前員工的上級(jí)編號(hào)與上一層級(jí)員工的編號(hào)相同。cte.level+1 表示當(dāng)前員工的層級(jí)比上一層級(jí)員工高1。
最后,我們使用 SELECT 查詢語(yǔ)句獲取最終結(jié)果,其中包含員工的編號(hào)、姓名和層高等信息。執(zhí)行以上語(yǔ)句,我們會(huì)得到以下結(jié)果:
id name level 1 張三 1 2 李四 2 5 錢(qián)七 1 3 王五 3 4 趙六 3 6 孫八 2
以上結(jié)果表示每個(gè)員工到根節(jié)點(diǎn)的距離,比如張三的層高為1,李四的層高為2,趙六的層高為3。