節點ID字段名和父級ID改爲你數據庫的字段名, 組織ID是查詢參數
List<String> getPrentOrgId(String 組織ID);
① 獲取當前節點所有父級節點(包含本身)
<!--查詢所有的父節點id(包含本身)-->
<select id="getPrentOrgId" resultType="java.lang.String">
SELECT T2.節點ID
FROM (
SELECT
@r AS _id,
(SELECT @r := 父級ID FROM 表名 WHERE 節點ID = _id) AS 父級ID,
@l := @l + 1 AS lvl FROM (SELECT @r := #{組織ID,jdbcType=VARCHAR}, @l := 0) vars,
表名 h WHERE @r != 0 AND 父級ID > 0
) T1 JOIN 表名 T2 ON T1._id = T2.節點ID ORDER BY T1.lvl DESC
</select>
② 獲取當前節點所有子級及子級以下節點(不包含本身)
注意:concat拼接的長度是有限制,不能太長,如果長度不夠,可能需要修改長度
<!--查詢所有的子節點id(不包含本身)-->
<select id="getChildOrgId" resultType="java.lang.String">
SELECT 節點ID FROM
(
SELECT * FROM 表名 where 父級ID > 0 ORDER BY 父級ID, 節點ID DESC
) realname_sorted,
(SELECT @pv :=#{組織ID,jdbcType=VARCHAR}) initialisation
WHERE (FIND_IN_SET(父級ID,@pv)>0 And @pv := concat(@pv, ',', 節點ID))
</select>
③ 獲取當前節點同級節點
<!--獲取當前節點同級節點-->
<select id="listOrgId" resultType="java.lang.String">
select 節點ID AS id FROM 表名
<if test="組織ID != null and 組織ID != ''">
where 父級ID=(select 父級ID FROM 表名 WHERE 節點ID=#{組織ID,jdbcType=VARCHAR} LIMIT 1)
</if>
</select>