11
回答
MySQL怎么递归获取所有子节点
【腾讯云】学生服务器套餐10元/月 >>>   

MySQL怎么递归获取所有子节点,不使用存储过程,不使用函数的情况下。

表结构是,子节点存了父结点的ID,父节点没有存任何子节点的信息。需要根据父节点获取所有子节点的时候,怎么用SQL实现呢

<无标签>
举报
qwzh110
发帖于9个月前 11回/324阅

以下是问题补充:

  • @qwzh110 :谢谢! 这种情况是应该用程序递归吗,程序递归会比数据库SQL递归性能要号码? (9个月前)
  • @qwzh110 :再弱弱的补充一个疑问,如果用程序递归的话,会不会一次请求导致的数据库请求太多,对数据库服务器造成压力呢 (9个月前)
共有11个答案 最后回答: 9个月前
解决方法是再增加一个辅助字段,具有分级的功能,比如父级是00001,子级就是0000100001 0000100002等,再下级,类推!于是要查这个父级下所有(包含父级),只需要一句:like concat('00001','%')

 JsonArray ListArray = new JsonArray();
                int id = 0;
                int parent = 0;
                int int_parent = TypeChange.getInstance().stringToInt(parentId);
                HashMap<Integer, JsonObject> list_map = new HashMap<>();//存放所有的用户
                HashMap<Integer, Integer> temp_map = new HashMap<>();//存放用户ID 和父级ID
                conn = ConfigManager.getInstance().getConnection();
                stmt = conn.prepareStatement("SELECT `User`.id,`User`.`name`,`User`.limitspace,`User`.space,`User`.parent,`User`.`status` FROM `User`");
                rs = stmt.executeQuery();
                while (rs.next()) {
                    JsonObject temp = new JsonObject();
                    id = rs.getInt(1);
                    temp.addProperty("id", id);
                    temp.addProperty("name", rs.getString(2));
                    temp.addProperty("limitspace", TypeChange.getInstance().autoChangeMB(rs.getInt(3)));
                    temp.addProperty("space", TypeChange.getInstance().autoChangeMB(rs.getInt(4)));
                    parent = rs.getInt(5);
                    temp.addProperty("parent", parent);
                    temp.addProperty("status", rs.getInt(6));
                    list_map.put(id, temp);
                    temp_map.put(id, parent);
                    temp = null;
                }
                rs.close();
                rs = null;
                stmt.close();
                stmt = null;
                ListArray = getChildren(int_parent, temp_map, list_map);
                request.addProperty(Config.RESULT, Boolean.FALSE);
                request.add("userList", ListArray);

 

 

//获取子集
    public JsonArray getChildren(int parentId, HashMap<Integer, Integer> map, HashMap<Integer, JsonObject> list_map) {
        JsonArray ListArray = new JsonArray();
        Iterator iter = map.entrySet().iterator();
        int key = 0;
        int val = 0;
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            key = (int) entry.getKey();
            val = (int) entry.getValue();

            if (val == parentId) {
                JsonObject temp = (JsonObject) list_map.get(key);
                temp.add("children", getChildren(key, map, list_map));
                ListArray.add(temp);
                temp = null;
            }
        }
        return ListArray;
    }

 

我用的方法,可以参考

http://blog.csdn.net/qq_32543377/article/details/72621700 
可以参考是SQL server 的这个,需求也是取某个节点下的所有子几点

是我的话,绝对不用数据库来递归。

写一个查询,然后去递归查几次就好了,条理清清楚楚。

--- 共有 1 条评论 ---
qwzh110如果用程序递归的话,会不会一次请求导致的数据库请求太多,对数据库服务器造成压力呢 9个月前 回复
顶部