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