鍍金池/ 問答/數(shù)據(jù)庫/ sql 的問題:我想查出來Id 為 7 下面的以及子節(jié)點 的所有標(biāo)準(zhǔn)

sql 的問題:我想查出來Id 為 7 下面的以及子節(jié)點 的所有標(biāo)準(zhǔn)

這是我的 Structure(體系) 表

clipboard.png

這是我的 Standard(標(biāo)準(zhǔn)) 表

clipboard.png

兩表之間的關(guān)系是 Standard 表的 StructureID 等于 Structure 中的Id 字段
現(xiàn)在我想查出來Id 為 7 下面的以及子節(jié)點 的所有標(biāo)準(zhǔn)

求指教有什么好的方法沒有各位大佬。我想到了sql遞歸查詢但是不太會請指教啊

回答
編輯回答
安于心

WITH locs(id,StructureCode,StructureName,StructureParentId)

        AS
        (
        SELECT Id,StructureCode,StructureName,StructureParentId FROM Structure WHERE StructureParentId=$id
        UNION ALL
        SELECT A.id,A.StructureCode,A.StructureName,A.StructureParentId FROM Structure A,locs B ON A.StructureParentId = B.id
        )
        
        select s.Id , st.StructureCode,s.StandardName, s.StandardNumber , s.PublishDate,s.ImplementDate ,s.OldStandardNumber from 
        Standard s ,Structure st LEFT JOIN StdFile sf ON s.StandardNumber=sf.StandardNumber WHERE s.StructureID=$id OR s.StructureID IN (SELECT id FROM locs) group by s.Id 

已經(jīng)測試數(shù)據(jù)跟你想要的一樣

2018年9月19日 05:24
編輯回答
櫻花霓

一步步來吧,首先先把Structure表中根節(jié)點為7的點挑選出來:

SELECT GROUP_CONCAT(lv SEPARATOR ',') AS StructureIds
     FROM
       (SELECT @root:=
          (SELECT GROUP_CONCAT(id SEPARATOR ',')
           FROM STRUCTURE
           WHERE FIND_IN_SET(StructureParentId, @root)) AS lv
        FROM STRUCTURE
        JOIN
          (SELECT @root:=7) tmp
        UNION (SELECT 7)) a
;

這條語句還比較好理解,就是從表的第一項開始,每一項給賦值一遍@root,條件為父節(jié)點在上一項@root中,然后就得到了tmp表,最后把tmp表的每一項@root連接起來;

然后就可以拿著這個字符串去Standard表中查詢了:

SELECT *
FROM Standard
WHERE StructureID IN
    (SELECT GROUP_CONCAT(lv SEPARATOR ',') AS StructureIds
     FROM
       (SELECT @root:=
          (SELECT GROUP_CONCAT(id SEPARATOR ',')
           FROM STRUCTURE
           WHERE FIND_IN_SET(StructureParentId, @root)) AS lv
        FROM STRUCTURE
        JOIN
          (SELECT @root:=1) tmp) a)
;

當(dāng)中需要注意的是FIND_INT_SET這個查找函數(shù)。

你試試呢,希望能幫助到你。

2018年8月5日 11:08