sql实现通过父级id查询所有的子集

通过sql实现传入父级id查询出所有的子集

最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现,

但很明显效率低下,所有考虑了下纯粹通过sql来实现这个功能点

效果展示

如图这个“水果”的数据其实是一个树的数据,列表上所展示的是顶级数据,点击详情时传入了顶级id,如何通过顶级id把他的子集全部找出来。

 需要达到的效果是点击详情后展示出所有的树型数据如

实现思路

首先我的这张表结构是这样的:

复制代码
CREATE TABLE `rule_entity_property` (
  `id` varchar(32) NOT NULL COMMENT '主键',
  `app_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用编码',
  `catalog_id` varchar(32) NOT NULL COMMENT '目录ID',
  `parent_id` varchar(32) NOT NULL COMMENT '上级ID',
  `type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类型',
  `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '(实体或属性)编码',
  `code_path` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '(实体或属性)完整编码',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '(实体或属性)名称',
  `descriptions` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '(实体或属性)描述',
  `null_able` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否可空(1可空,0不可空)',
  `gmt_tenant` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'master' COMMENT '租户',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
  `gmt_mfyname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '最后修改人名称',
  `gmt_creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人',
  `gmt_crtname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人名称',
  `gmt_modifiedby` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '最后修改人',
  `gmt_status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '(1:不可删,2:登陆需修改密码)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规则实体属性表';
复制代码

在页面中新增这块的数据完后有如下数据:

SQL实现的语句:

复制代码
SELECT
        t3.*
    FROM (
        SELECT
            t1.*,
            t2.*,
            IF(FIND_IN_SET(parent_id, @pids) > 0, @pids := CONCAT(@pids, ',', id), '0') AS isChild
        FROM (
            SELECT * FROM rule_entity_property WHERE gmt_status != '-1' ORDER BY name,parent_id,id
        ) AS t1,
        ( SELECT @pids := 这里是传进来的顶级id ) AS t2
    ) t3
    WHERE t3.isChild != '0'
复制代码

测试如下:

我传入上图中果子的id:634def6720c418f85c0228cae5ac5f26

查询出的结果:

如上图通过一句sql实现了该功能避免去做程序的递归操作。

小提示:其实这个sql主要是通过FIND_IN_SET函数去实现,很简单,不清楚原理的可以去看看这个函数用法。

posted @   Yubaba丶  阅读(6335)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示