MySQL怎么递归获取所有子节点

qwzh110 发布于 2017/08/23 13:39
阅读 415
收藏 1

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

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

以下是问题补充:

@qwzh110:谢谢! 这种情况是应该用程序递归吗,程序递归会比数据库SQL递归性能要号码? (2017/08/24 18:09)
@qwzh110:再弱弱的补充一个疑问,如果用程序递归的话,会不会一次请求导致的数据库请求太多,对数据库服务器造成压力呢 (2017/08/26 08:39)
加载中
1
熊猫叔叔
解决方法是再增加一个辅助字段,具有分级的功能,比如父级是00001,子级就是0000100001 0000100002等,再下级,类推!于是要查这个父级下所有(包含父级),只需要一句:like concat('00001','%')
0
w
wxsl

用cte可以生成一个树形结构

0
mia0x75
mia0x75

CTE要MariaDB 10.2+,设计时没考虑,无解,要不改设计,要不改产品。

0
foy
foy

不加限制条件情况下,mysql下没法一条sql写出来。

视数据量、应用场景,改造结构把。

0
ZJJSCFL
ZJJSCFL

 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;
    }

 

我用的方法,可以参考

0
ToxicLovers
ToxicLovers

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

0
开源中国-首席营养师

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

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

qwzh110
qwzh110
如果用程序递归的话,会不会一次请求导致的数据库请求太多,对数据库服务器造成压力呢
0
Kylin_Shaw
Kylin_Shaw

我觉得这种事情,不应该交给数据库去做把

0
_
_乌托邦
sql语句没办法实现,可以考虑存储过程
返回顶部
顶部