Mysql 獲取父級 子級 同級

節點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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章