3 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
MySQL不支持遞歸查詢,因此您必須采用困難的方式:
選擇您的根在ParentID = X哪里的行X。
Id從(1)收集值。
對(duì)Id(2)中的每個(gè)重復(fù)(1 )。
繼續(xù)手動(dòng)遞歸,直到找到所有葉子節(jié)點(diǎn)。
如果您知道最大深度,則可以將表連接到自身(使用LEFT OUTER JOINs),使其達(dá)到最大可能深度,然后清除NULL。
您也可以將樹(shù)的表示形式更改為嵌套集。

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是一個(gè)舊主題,但是由于我在另一個(gè)論壇中遇到了這個(gè)問(wèn)題,所以我想在這里添加它。對(duì)于這種情況,我創(chuàng)建了一個(gè)存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程經(jīng)過(guò)硬編碼以處理特定情況。當(dāng)然這樣做確實(shí)有一些缺點(diǎn),因?yàn)椴⒎撬杏脩舳伎梢噪S意創(chuàng)建存儲(chǔ)過(guò)程。
考慮具有節(jié)點(diǎn)和子節(jié)點(diǎn)的下表:
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);
使用此表,以下存儲(chǔ)過(guò)程將計(jì)算一個(gè)由所提供節(jié)點(diǎn)的所有后代組成的結(jié)果集:
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 ;

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
下面select列出了所有植物及其parentid最高4級(jí)(當(dāng)然,您可以擴(kuò)展該級(jí)):
select id, name, parentid
,(select parentid from tb_tree where id=t.parentid) parentid2
,(select parentid from tb_tree where id=(select parentid from tb_tree where id=t.parentid)) parentid3
,(select parentid from tb_tree where id=(select parentid from tb_tree where id=(select parentid from tb_tree where id=t.parentid))) parentid4
from tb_tree t
然后您可以使用此查詢獲取最終結(jié)果。例如,您可以通過(guò)以下sql獲取“水果”的所有子代:
select id ,name from (
select id, name, parentid
,(select parentid from tb_tree where id=t.parentid) parentid2
,(select parentid from tb_tree where id=(select parentid from tb_tree where id=t.parentid)) parentid3
,(select parentid from tb_tree where id=(select parentid from tb_tree where id=(select parentid from tb_tree where id=t.parentid))) parentid4
from tb_tree t) tt
where ifnull(parentid4,0)=1 or ifnull(parentid3,0)=1 or ifnull(parentid2,0)=1 or ifnull(parentid,0)=1
添加回答
舉報(bào)