Mysql實(shí)現(xiàn)樹形遞歸查詢

最近在做項(xiàng)目遷移,Oracle版本的遷到Mysql版本,遇到有些oracle的函數(shù),mysql并沒(méi)有,所以就只好想自定義函數(shù)或者找到替換函數(shù)的方法進(jìn)行改造。

Oracle遞歸查詢
oracle實(shí)現(xiàn)遞歸查詢的話,就可以使用start with ... connect by

connect by遞歸查詢基本語(yǔ)法是:

select 1 from 表格 start with ... connect by prior id = pId 

start with:表示以什么為根節(jié)點(diǎn),不加限制可以寫1=1,要以id為123的節(jié)點(diǎn)為根節(jié)點(diǎn),就寫為start with id =123

connect by:connect by是必須的,start with有些情況是可以省略的,或者直接start with 1=1不加限制

prior:prior關(guān)鍵字可以放在等號(hào)的前面,也可以放在等號(hào)的后面,表示的意義是不一樣的,比如 prior id = pid,就表示pid就是這條記錄的根節(jié)點(diǎn)了

具體可以參考我以前寫的一篇oracle方面的博客:https://blog.csdn.net/u014427391/article/details/84996259

Oracle方面的實(shí)現(xiàn)

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="oracle">
        select distinct u.unit_code,
              u.unit_name,
              u.unit_tel,
              u.para_unit_code
         from lzcity_approve_unit_info u
         start with 1 = 1
         <if test="unitCode != null and unitCode !=''">
            and u.unit_code = #{unitCode}
         </if>
         <if test="unitName!=null and unitName!=''">
            and u.unit_name like '%'|| #{unitName} ||'%'
         </if>
         connect by prior u.unit_code = u.para_unit_code
            and u.unit_code &lt;>u.para_unit_code
    </select>

Mysql遞歸查詢
下面主要介紹Mysql方面的實(shí)現(xiàn),Mysql并沒(méi)有提供類似函數(shù),所以只能通過(guò)自定義函數(shù)實(shí)現(xiàn),網(wǎng)上很多這種資料,不過(guò)已經(jīng)不知道那篇是原創(chuàng)了,這篇博客寫的不錯(cuò),https://www.2cto.com/database/201209/152513.html, 下面我也是用作者提供的方法實(shí)現(xiàn)自己的,先感謝作者的分享

這里借用作者提供的自定義函數(shù),再加上Find_in_set函數(shù) find_in_set(u.unit_code,getunitChildList(#{unitCode})),getunitChildList是自定義函數(shù)

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="mysql">
        select distinct u.unit_code,
              u.unit_name,
              u.unit_tel,
              u.para_unit_code
         from t_unit_info u
         <where>
             <if test="unitCode != null and unitCode !=''">
                and find_in_set(u.unit_code,getunitChildList(#{unitCode}))
             </if>
             <if test="unitName!=null and unitName!=''">
                and u.unit_name like concat('%', #{unitName} ,'%')
             </if>
         </where>
    </select>

getUnitChildList自定義函數(shù)

DELIMITER $$

USE `gd_base`$$

DROP FUNCTION IF EXISTS `getUnitChildList`$$

CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
      DECLARE sChildList VARCHAR(1000);
      DECLARE sChildTemp VARCHAR(1000);
      SET sChildTemp =CAST(rootId AS CHAR);
      WHILE sChildTemp IS NOT NULL DO
        IF (sChildList IS NOT NULL) THEN
          SET sChildList = CONCAT(sChildList,',',sChildTemp);
    ELSE
      SET sChildList = CONCAT(sChildTemp);
    END IF;
        SELECT GROUP_CONCAT(unit_code) INTO sChildTemp FROM LZCITY_APPROVE_UNIT_INFO WHERE FIND_IN_SET(para_unit_code,sChildTemp)>0;
        END WHILE;
      RETURN sChildList;
END$$

DELIMITER ;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近工作中遇到了一個(gè)問(wèn)題,需要根據(jù)保存的流程數(shù)據(jù),構(gòu)建流程圖。數(shù)據(jù)庫(kù)中保存的流程數(shù)據(jù)是樹形結(jié)構(gòu)的,表結(jié)構(gòu)及數(shù)據(jù)如下...
    圣杰閱讀 9,088評(píng)論 2 7
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 6,037評(píng)論 0 9
  • 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二進(jìn)制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,906評(píng)論 0 31
  • 老公很有意思,說(shuō)微信沒(méi)錢了,要我轉(zhuǎn)個(gè)賬。我二話沒(méi)說(shuō),也沒(méi)問(wèn)金額就轉(zhuǎn)了200,過(guò)了一會(huì),他轉(zhuǎn)了520元給我。我哭笑不...
    譚虹閱讀 174評(píng)論 0 0
  • ? 許久不見(jiàn),甚是想念 機(jī)長(zhǎng)又來(lái)跟大家見(jiàn)面了 很多老乘客發(fā)現(xiàn)了,孤獨(dú)航空逐漸從電影分享評(píng)論號(hào),更多的變成了一個(gè)態(tài)度...
    孤獨(dú)的航空公司閱讀 971評(píng)論 1 4

友情鏈接更多精彩內(nèi)容