复制INSERT INTO groups VALUES (0, null, 系统管理组织); INSERT INTO groups VALUES (1, 0, 中国电信股份有限公司); INSERT INTO groups VALUES (2, 1, 万州分公司); INSERT INTO groups VALUES (3, 1, 涪陵分公司); INSERT INTO groups VALUES (4, 2, 龙都支局); INSERT INTO groups VALUES (5, 2, 新田支局); INSERT INTO groups VALUES (6, 3, 马武支局); INSERT INTO groups VALUES (7, 3, 南沱支局); INSERT INTO groups VALUES (8, 4, 党群工作部); INSERT INTO groups VALUES (9, 5, 客户服务部); INSERT INTO groups VALUES (10, 6, 采购和供应链管理事业部); INSERT INTO groups VALUES (11, 7, 网络和信息安全管理部);1.2.3.4.5.6.7.8.9.10.11.12.
复制WITH RECURSIVE subordinates AS ( SELECT group_id,到所点 group_name, parent_id FROM groups WHERE parent_id = 2 -- 指定父节点ID UNION ALL SELECT g.group_id, g.group_name, g.parent_id FROM groups g INNER JOIN subordinates s ON s.group_id = g.parent_id ) SELECT * FROM subordinates;1.2.3.4.5.6.7.8.9.10.11.12. 使用了WITH RECURSIVE子句,它创建了一个名为subordinates的递归公共表达式(CTE)从groups表中选择group_id,云服务器group_name和parent_id字段,其中parent_id = 2,也就是选择parent_id=2直接子组将groups表(别名为g)与subordinates(别名为s)进行内连接。连接条件是g的parent_id等于s的group_id。这意味着我们正在查找先前找到的每个子组的子组从subordinates中选择所有行 复制group_id|group_name|parent_id| --------+----------+---------+ 4|龙都支局 | 2| 5|新田支局 | 2| 8|党群工作部 | 4| 9|客户服务部 | 5|1.2.3.4.5.6.
代码递归
复制@Test public void test1() { List<Map<String, Object>> groupList = new ArrayList<>(); groupList = queryListParentId(2,groupList); System.out.println(groupList); groupList.clear(); System.out.println("====================="); List<String>list = new ArrayList<>(); list.add("3"); groupList = queryListParentId2(list,groupList); System.out.println(groupList); } //方式一,循环遍历查询 public List<Map<String, Object>> queryListParentId(Integer parentId,List<Map<String, Object>> groupList) { String sql = "select group_id,group_name from groups where parent_id = "+ parentId; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); if(!CollectionUtils.isEmpty(list)){ groupList.addAll(list); for (Map<String, Object> map : list){ queryListParentId((Integer) map.get("group_id"),groupList); } } return groupList; } //方式二,免费源码下载使用find_in_set函数 public List<Map<String, Object>> queryListParentId2(List<String> parentId,List<Map<String, Object>> groupList) { String join = String.join(",", parentId); String sql = "select group_id,group_name from groups where find_in_set(parent_id,"+ join+")"; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); if(!CollectionUtils.isEmpty(list)){ groupList.addAll(list); List<String> collect = list.stream().map(map -> map.get("group_id")+"").collect(Collectors.toList()); queryListParentId2(collect,groupList); } return groupList; }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40. 复制[{group_id=4, group_name=龙都支局}, {group_id=5, group_name=新田支局}, {group_id=8, group_name=党群工作部}, {group_id=9, group_name=客户服务部}] ===================== [{group_id=6, group_name=马武支局}, {group_id=7, group_name=南沱支局}, {group_id=10, group_name=采购和供应链管理事业部}, {group_id=11, group_name=网络和信息安全管理部}]1.2.3.