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。