在MySQL中查詢一個部門下所有的子部門,需要使用遞歸查詢。遞歸查詢可以使用with語句或者存儲過程來實現(xiàn)。
首先我們來看使用with語句實現(xiàn)遞歸查詢。
WITH RECURSIVE all_departments AS ( SELECT * FROM department WHERE id = ? UNION SELECT d.* FROM department d JOIN all_departments ad ON d.parent_id = ad.id ) SELECT * FROM all_departments;
上面的代碼中,使用了WITH RECURSIVE語句來定義一個遞歸查詢的公共表達(dá)式 all_departments。這個公共表達(dá)式由兩條SELECT語句組成,第一條SELECT語句返回指定部門(id=?)的信息,第二條SELECT語句通過JOIN all_departments ad ON d.parent_id = ad.id來將每個部門的所有子部門和它自己連接起來。最后通過SELECT * FROM all_departments來返回所有部門的信息。
下面我們來看另一種方法,使用存儲過程來實現(xiàn)遞歸查詢。
DELIMITER // CREATE PROCEDURE find_children_department( IN parent_id INT, INOUT results TEXT ) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE cur_department_id, child_department_id INT; DECLARE cur_department_name, child_department_name VARCHAR(50); DECLARE cur_department_cursor CURSOR FOR SELECT id, name FROM department WHERE id=parent_id; DECLARE children_departments_cursor CURSOR FOR SELECT id, name FROM department WHERE parent_id=cur_department_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur_department_cursor; FETCH cur_department_cursor INTO cur_department_id, cur_department_name; SET results = CONCAT(results, cur_department_id, ':', cur_department_name, '\n'); OPEN children_departments_cursor; read_loop: LOOP FETCH children_departments_cursor INTO child_department_id, child_department_name; IF done THEN LEAVE read_loop; END IF; SET results = CONCAT(results, child_department_id, ':', child_department_name, '\n'); CALL find_children_department(child_department_id, results); END LOOP; CLOSE children_departments_cursor; CLOSE cur_department_cursor; END // DELIMITER ;
上面的代碼中,我們定義了一個存儲過程 find_children_department。這個存儲過程接受一個parent_id作為輸入?yún)?shù),用來指定需要查詢的部門。我們使用兩個游標(biāo)來實現(xiàn)遞歸查詢,cur_department_cursor用來查找當(dāng)前部門的信息,children_departments_cursor用來查找當(dāng)前部門的所有子部門。我們使用循環(huán)來遍歷每個子部門,同時調(diào)用存儲過程本身來查找子部門的子部門,最終將結(jié)果保存在results參數(shù)中。
以上是使用MySQL實現(xiàn)遞歸查詢的兩種方法,使用WITH RECURSIVE語句比較簡單,而使用存儲過程可以更加靈活,可以實現(xiàn)更復(fù)雜的遞歸查詢。如果你需要在MySQL中查詢一個部門下所有子部門的信息,可以根據(jù)實際情況選擇適合的方法。