文档章节

数据库树型结构查询(MySQL)

魔法刀客
 魔法刀客
发布于 2014/11/15 22:07
字数 464
阅读 326
收藏 3

转载请注明:http://user.qzone.qq.com/97039144/blog/1416059888
1.建表语句: create table tree( id int , name varchar(255),parent_id int);

2.要展现树型的话,上面的数据结构需要程序来做转换,下面给出程序,可支持N层结构的树型。

3.TreeBuilder.java

public class TreeBuilder{
    /**
       算法思想是: 使用map 作id 与记录的映射,
       第一步把root节点找出并标记为删除;
       第二步遍历记录列表取出每个的父id,然后到映射里找到相应的记录parent,把当前记录作为parent的children;
       第三步把收集器里的记录转换成list。
        
        注意:这里使用了Map 数据结构 与  java 的 引用特性;虽然map 与 picking 是两次遍历 records,但里面相同的key的记录引用 是
        指向相同的内存的。
    **/
    public List builder(List records){
        
//映射id与记录成为  {id : record}
        Map<String,Map> map = new HashMap<String,Map>();
        for(Map su : records){
            map.put(MapUtils.getString(su, "id"), su);
        }
        //收集
    Map<String,Map> picking = new HashMap<String,Map>();
    for(Map su : records){
        String parentId = MapUtils.getString(su, "parent_id");
        boolean removed =  MapUtils.getBoolean(su, "removed",false);
        if("0" .equals(parentId)  && !removed){//父id为0,此时为root
            picking.put(MapUtils.getString(su, "id"), su);
            su.put("removed", true);//标记为删除,不可真删除,否则会报currencyXXXX的异常
        }
    }
    //构建树
    for(Map su : records){
        String parentId = MapUtils.getString(su, "parent_id");
        boolean removed =  MapUtils.getBoolean(su, "removed",false);
        if(!"0" .equals(parentId) && !removed){
            Map parent = map.get(parentId);//取出映射中的记录
            if( parent.containsKey("children") ){//是否有子节点,有把当前记录作为子节点
                List<Map> children = (List<Map>)parent.get("children");
                children.add(su);
            }else{//无,则添加子节点容器,再把当前记录作为子节点
                List<Map> children = new ArrayList<Map>();
                children.add(su);
                parent.put("children", children);
            }
        //标记为删除,不可真删除,否则会报currencyXXXX的异常
        su.put("removed", true);
        }
}
    //转为list
    List<Map> result = new ArrayList();
    Set<String> keySet = picking.keySet();
    for(String key : keySet){
    Map resultItem = map.get(key);
    result.add(map.get(key));
    }
    return result;
    }
}


© 著作权归作者所有

魔法刀客
粉丝 5
博文 29
码字总数 10014
作品 0
广州
后端工程师
私信 提问
加载中

评论(2)

魔法刀客
魔法刀客 博主

引用来自“993968”的评论

MapUtils.getString 这个方法没给出
这个是apache的 MapUtils,换成Map.get(Object key);
993968
993968
MapUtils.getString 这个方法没给出
SQL-SQL优化-索引

图文并茂详解 SQL JOIN Join 是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用 Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一...

掘金官方
2017/12/25
0
0
【转】左右值无限分类实现算法

一、引言 产品分类,多级的树状结构的论坛,邮件列表等许多地方我们都会遇到这样的问题:如何存储多级结构的数据?在PHP的应用中,提供后台数据存储的通常是关系型数据库,它能够保存大量的数...

王二铁
2011/11/01
193
0
左右值无限分类实现算法

一、引言 产 品分类,多级的树状结构的论坛,邮件列表等许多地方我们都会遇到这样的问题:如何存储多级结构的数据?在PHP的应用中,提供后台数据存储的通常是关系型 数据库,它能够保存大量的...

bengozhong
2016/09/09
78
0
【BATJ】面试必问MySQL索引实现原理

BATJ面试题剖析 1、为什么需要使用索引? 2、数据结构Hash、平衡二叉树、B树、B+树区别? 3、机械硬盘、固态硬盘区别? 4、Myisam与Innodb B+树的区别? 5、MySQL中的索引什么数据结构? 6、...

须臾之余
05/22
115
0
文档型数据库设计模式-如何存储树形数据

在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。 此文以存储树形结构数据为需求,分别描述了利...

索隆
2012/09/12
149
0

没有更多内容

加载失败,请刷新页面

加载更多

redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
今天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
24
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部