sql 的问题:我想查出来Id 为 7 下面的以及子节点 的所有标准

这是我的 Structure(体系) 表

clipboard.png

这是我的 Standard(标准) 表

clipboard.png

两表之间的关系是 Standard 表的 StructureID 等于 Structure 中的Id 字段
现在我想查出来Id 为 7 下面的以及子节点 的所有标准

求指教有什么好的方法没有各位大佬。我想到了sql递归查询但是不太会请指教啊

阅读 2.4k
2 个回答

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 

已经测试数据跟你想要的一样

一步步来吧,首先先把Structure表中根节点为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,条件为父节点在上一项@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)
;

当中需要注意的是FIND_INT_SET这个查找函数。

你试试呢,希望能帮助到你。

推荐问题