t1.*,         ( FIND_IN_SET( parent_id, @parent_ids ) > 0, @parent_ids := CONCAT( @parent_ids, ',', id ), '0' ) AS ischild          ( SELECT * FROM blade_menu AS t WHERE t.is_deleted = 0 AND client_type = 'dianduyun_app' ORDER BY t.id ASC ) t1,         ( SELECT @parent_ids := '1508255373140103170' ) t2  WHERE     ischild != '0'


需要修改的地方

  • parent_id,改为你的父级id字段
  • blade_menu ,改为你的表名称
  • WHERE t.is_deleted = 0 ,改为你的查询条件
  • @parent_ids := ‘1508255373140103170’,值改为你要传入的父级id

SQL方法二:

SELECT
    ( SELECT * FROM fine_authority_object WHERE parentId IS NOT NULL AND is_deleted = 0 ) rd,
    ( SELECT @pid := '2342465874553522423' ) pd 
WHERE
    FIND_IN_SET( parentId, @pid ) > 0 
    AND @pid := concat( @pid, ',', id ) 
UNION
SELECT
    fine_authority_object 
WHERE
    FIND_IN_SET( id, @pid ) > 0;


需要修改的地方

  • fine_authority_object ,改为你的表名,以及后面的查询条件进行修改。
  • SELECT @pid := ‘2342465874553522423’ ,值改为你要传的父id的值
  • FIND_IN_SET( parentId, @pid ) ,parentId改为你的父级id字段名
  • 当前这条SQL是根据多个父节点查询所有子节点(包含自身)
  • 如果不想查询结果包含自身,去掉后边的union

执行结果示例

同方法二的例子:查询父区域下的所有子区域(包括4/5级)

SELECT
	( SELECT * FROM sys_region WHERE pid IS NOT NULL ) rd,
	( SELECT @p_id := '19' ) pd 
WHERE
	FIND_IN_SET( pid, @p_id ) > 0 
	AND @p_id := concat( @p_id, ',', region_id ) 
CREATE TABLE `sys_region` (
  `region_id` bigint(20) NOT NULL COMMENT '主键',
  `pid` bigint(20) DEFAULT NULL COMMENT '父id',
  `region_name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',
  `region_code` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '编码',
  `type` tinyint(4) DEFAULT NULL COMMENT '类型',
  `remark` varchar(1000) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
  `del_flag` tinyint(4) DEFAULT NULL COMMENT '删除标记',
  `create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `longitude` decimal(10,6) DEFAULT NULL COMMENT '经度',
  `latitude` decimal(10,6) DEFAULT NULL COMMENT '纬度',
  PRIMARY KEY (`region_id`) USING BTREE,
  KEY `region_code_index` (`region_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC COMMENT='行政区域';

Java List转树形结构


另外再分享一个将上面查询出来的list给转成树形结构的形式给前端返回的一个工具类。

 public static List<ReportTemplateVo> listToTree2(List<ReportTemplateVo> list) {
        List<ReportTemplateVo> tree = new ArrayList<>();
        for (ReportTemplateVo ReportTemplateVo : list) {
            //找到根节点
            if (ReportTemplateVo.getParentId().equals("reportlets")) {
                tree.add(findChildren(ReportTemplateVo, list));
        return tree;
     * 查找ReportTemplateVo的子节点
     * @param ReportTemplateVo
     * @param list
     * @return
    private static ReportTemplateVo findChildren(ReportTemplateVo ReportTemplateVo, List<ReportTemplateVo> list) {
        List<ReportTemplateVo> children = new ArrayList<>();
        for (ReportTemplateVo node : list) {
            if (node.getParentId().equals(ReportTemplateVo.getId())) {
                //递归调用
                children.add(findChildren(node, list));
        ReportTemplateVo.setChildren(children);
        return ReportTemplateVo;



ReportTemplateVo实体:

public class ReportTemplateVo  {
    private static final long serialVersionUID = 1L;
     * 主键ID
    private String id;
     * 父节点ID
    private String parentId;
     * 子孙节点
    private List<ReportTemplateVo> children;
    @ApiModelProperty("节点是否可以被选中")
    private Boolean disabled;
     * 节点名称
    @ApiModelProperty("节点名称")
    private String title;


这两种方法都可以查询到自己想要的数据。然后调用这个方法可以直接生成相应的树形结构,这种东西很常用,又懒得自己写, 所以勤记录,多做备份会省很多事儿,
 

以前有个功能需要递归查询子节点,自己不会写,从网上摘了个sql,改了改能用。这几天又遇到一个类似的功能,但早已忘记sql怎么写,于是翻箱倒柜找出以前和朋友的聊天记录找到了sql,改了改又能用了。怕以后忘记,记录一下。。。这个写法是从网上找的,忘了从哪儿摘的了。。。 根据一个父节点查询所有子节点(包含自身) SELECT rd.* FROM (SELECT * FROM sys_dict WHERE parent_id IS NOT NULL) rd, (SELECT @pid... SELECT T0.* FROM TEMP,CO_Department T0 WHERE TEMP.ParentID=T0.ID --父级ID==子级ID。--------------------02.向下查找所有子节点------------------------------------------------01.向上查找所有父节点-----------------如图:根据"测试组"查找所有父节点。如图:根据"开发组"查找所有子节点。 此sql查询id=2的所有子节点id,并包括当前id=2的节点,如果不想包括当前节点,去掉。此sql查询id=3的所有父节点sql,parent_id:父id。