mysql 根據父節點id獲取父節點和所有子節點

傳入id為1 獲取資料庫中寶雞市下所有的縣鎮村
用的mysql和mybatis
uj5u.com熱心網友回復:
需要寫個函式uj5u.com熱心網友回復:
查詢資料結構的遍歷演算法,使用一個遞回或者堆疊來操作,簡單來說:一個堆疊存放中間程序中的節點,一個堆疊存放結果節點。
把根節點的直接子節點入堆疊1;
從堆疊1取出一個節點,放入堆疊2;并查找其子節點全部放入堆疊1;重復該步驟直到堆疊1為空。
堆疊2就是全部的子節點。
uj5u.com熱心網友回復:
或者在編碼上想辦法,比如類似郵政編碼,編碼是分級的,518000是518XXX的根節點~~分級編碼查詢效率會高很多,但更新修改復雜。要否采用看你的編碼體系是不是穩定,要不要經常變。
uj5u.com熱心網友回復:
如果表結構可以改的話可以加一列path用來記錄路徑,例如西關-/0-1-2,統計1的所有子集的話直接path包含0的就是了uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
DROP FUNCTION IF EXISTS diguihanshu;
CREATE FUNCTION diguihanshu(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sid VARCHAR(4000);
DECLARE sidChd VARCHAR(4000);
SET sid='$';
SET sidChd = CAST(areaId AS CHAR);
WHILE sidChd IS NOT NULL DO
SET sid= CONCAT(sid,',',sidChd);
SELECT GROUP_CONCAT(id) INTO sidChd FROM digui WHERE FIND_IN_SET(pid,sidChd)>0;
END WHILE;
RETURN sid;
END;
SELECT * FROM digui WHERE FIND_IN_SET(id,diguihanshu(6));
uj5u.com熱心網友回復:
上面是創建一個存盤程序。 下面才是查詢SELECT * FROM digui WHERE FIND_IN_SET(id,diguihanshu(1));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/103707.html
標籤:MySQL
下一篇:metabase
