MySQL是目前最流行的關系型數據庫管理系統之一, 它的循環查詢功能非常強大, 可以讓開發者自由靈活地進行數據庫查詢操作, 接下來就讓我們一起學習如何循環一級級查詢。
/* 創建部門表 */ CREATE TABLE department( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(200) NOT NULL, parent_id INT DEFAULT NULL ); /* 插入數據 */ INSERT INTO department(name, parent_id) VALUES('CEO', NULL); INSERT INTO department(name, parent_id) VALUES('技術部', 1); INSERT INTO department(name, parent_id) VALUES('市場部', 1); INSERT INTO department(name, parent_id) VALUES('研發部', 2); INSERT INTO department(name, parent_id) VALUES('測試部', 2); INSERT INTO department(name, parent_id) VALUES('銷售部', 3); INSERT INTO department(name, parent_id) VALUES('宣傳部', 3); INSERT INTO department(name, parent_id) VALUES('推廣部', 4); INSERT INTO department(name, parent_id) VALUES('前端組', 4); INSERT INTO department(name, parent_id) VALUES('后端組', 4); INSERT INTO department(name, parent_id) VALUES('移動組', 4);
如上所示,我們創建了部門表,并插入了一些數據。這里parent_id表示上級部門id,NULL表示最高級部門或沒有上級部門。
/* 定義循環體 */ DELIMITER $$ CREATE PROCEDURE get_sub_department(IN p_department_id INT) BEGIN SELECT id, name, parent_id FROM department WHERE parent_id = p_department_id; /* 定義變量 */ DECLARE done INT DEFAULT FALSE; DECLARE next_department_id INT; /* 定義游標 */ DECLARE cur CURSOR FOR SELECT id FROM department WHERE parent_id = p_department_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; /* 開始循環 */ OPEN cur; read_loop: LOOP /* 讀取游標 */ FETCH cur INTO next_department_id; /* 判斷游標是否結束 */ IF done THEN LEAVE read_loop; END IF; /* 遞歸執行 */ CALL get_sub_department(next_department_id); END LOOP; /* 關閉游標 */ CLOSE cur; END$$ DELIMITER ;
此處我們定義了一個存儲過程get_sub_department,它接收一個p_department_id參數,返回該部門的所有下級部門。將游標讀取到的next_department_id作為參數遞歸調用get_sub_department存儲過程實現循環查詢。
/* 調用存儲過程 */ CALL get_sub_department(NULL);
通過以上代碼,我們可以調用get_sub_department存儲過程,并將NULL作為參數來獲取所有部門的層級關系。可以看到,MySQL提供了很強大的功能來完成層級查詢,開發者可以根據實際需要進行調整和擴展。
上一篇css漸變的類型