假设树定义如下
tree_table(tree_id varchar(50) primary key,parent_id varchar(50),name varchar(50))

查询如下:
select t2.tree_id from

(select @r as _id,(select  @r:=tree_id from  tree_table where tree_id =_id) 2v2
from(select @r:=#{searchTreeId})vars,tree_tablec
where @r is not null) t1 join tree_tablet2 on t1._id=t2.tree_id )

以上查询结果包含了自身节点

mysql 中 find_in_set不会使用索引,因此如果要使用索引就必须优化处理
假设表结构如下
tree_info (tree_id varchar(50) primary key,parent_id varchar(50),name varchar(50))

select t.tree_id from (

                         select t.tree_id ,if(FIND_IN_SET(t.parent_id,@pids)>0,@pids:=concat(@pids,',',t.tree_id ),-1) as is_child from 
                        (select t.tree_id ,t.parent_id from tree_info t   order by t.parent_id ,t.tree_id )t ,
                        (select @pids:=#{searchTreeId}

可以查询出当前节点的所有子节点

问题出现的情景:
我们在写代码的时候很自然的会用到一些常量,习惯性的我们会定义在某一个类文件类,然后在其他的使用的地方引用这个类中的变量。
然后有一天,由于某些问题导致不得不修改某个已经定义好的常量的的值,这时候我们可能对服务器做增量方式的更新,那我们可能就值更新这常量问题,而其它相关使用这个常量的文件并没有更新,然而。。。。。,奇葩的问题就出现了。

情景案例
class A{
public static final String VERSION="1.0.0";
}
class B{
public static void main(){

 System.out.println(A.VERSION);

}
}
然后某天
我们修改了A
class A{
public static final String VERSION="1.0.1";
}
然鹅我们在服务器上只更新了A文件,并没有更新B文件,这是你会发现打印出来的还是1.0.0,并不是1.0.1

为什么会出现这个奇葩现象呢?

为了跟踪这个问题,我们使用java反编译工具发现,原来B反编译后的代码为:
class B{
public static void main(){

 System.out.println("1.0.0");

}
}
终于根源问题找到了

虽然问题找到了根源,但是为什么会出现这个情况呢?
我们定义常量的目的是为了更好的维护,但是在java编译过程中,由于对代码进行优化出现,自动的将相关常量信息编译自动连接编译到结果里,而不是引用类中的数据。那按这个方式理解,我们修改常某个常量就需要对所有涉及到的文件进行更新,这也就势必要求运维在更新时只能选择全量更新,而不能只更新某一个类文件。

那我的疑问就来了,那是不是我们编译后,这个常量文件是否还有存在的意义呢?

cmake -DCMAKE_INSTALL_PREFIX=/home/app/mysql -DMYSQL_DATADIR=/home/app/mysql/data -DSYSCONFDIR=/home/app/mysql/etc -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=boost