這是一個古老的線程,但因爲我在另一個論壇得到了這個問題,我想我'd在這裏添加它。對於這種情況,我創建了一個硬編碼的存儲過程來處理特定情況。這當然有一些缺點,因爲並不是所有用戶都可以隨意創建存儲過程,但是。
考慮下面的表節點和兒童:
CREATE TABLE nodes (
parent INT,
child INT
);
INSERT INTO nodes VALUES
(5, 2), (5, 3),
(18, 11), (18, 7),
(17, 9), (17, 8),
(26, 13), (26, 1), (26,12),
(15, 10), (15, 5),
(38, 15), (38, 17), (38, 6),
(NULL, 38), (NULL, 26), (NULL, 18);
有了這張表,以下存儲過程將計算結果集,包括所提供的該節點的所有死者的:
delimiter $$
CREATE PROCEDURE find_parts(seed INT)
BEGIN
-- Temporary storage
DROP TABLE IF EXISTS _result;
CREATE TEMPORARY TABLE _result (node INT PRIMARY KEY);
-- Seeding
INSERT INTO _result VALUES (seed);
-- Iteration
DROP TABLE IF EXISTS _tmp;
CREATE TEMPORARY TABLE _tmp LIKE _result;
REPEAT
TRUNCATE TABLE _tmp;
INSERT INTO _tmp SELECT child AS node
FROM _result JOIN nodes ON node = parent;
INSERT IGNORE INTO _result SELECT node FROM _tmp;
UNTIL ROW_COUNT() = 0
END REPEAT;
DROP TABLE _tmp;
SELECT * FROM _result;
END $$
delimiter ;
我覺得 「WITH」 可以幫助您與遞歸查詢。 – FUD
請你詳細說明一下嗎?謝謝 – Jake
MySQL沒有CTE('WITH') –