SQL 无限极表递归查询

前言

查询一张无限极表 父子ID

SQL

不包含父类

 SELECT A.*
FROM (SELECT * FROM sixs_organization_manage) A,
     (SELECT @pv := 1) B
WHERE find_in_set(A.som_parent_id, @pv)
  AND length(@pv := concat(@pv, ',', som_id));

释义

-- find_in_set() 查询当前字符串 在目标字符串中位置 没有返回0 第一位返回1
select find_in_set('A', 'A,B,C');
-- concat() concat()函数用于将多个字符串连接起来,形成一个单一的字符串
select concat('A', ',', 'A,B');
-- A,AB
-- length() 获取长度
select length('ABC');

在这里插入图片描述

包含顶级父类

其实就是单独查询顶级父类然后关联子查询即可

select * from A where id=1
union
递归SQL

向上获取层级名称

获取当前层级加父类名称CBM-合同>合同管理>合同交接
参考文章:MYSQL无限极分类递归向上向下查询SQL语句实现

       SELECT REPLACE(GROUP_CONCAT(category_name), ',', '>')
        FROM hit_categories
        where FIND_IN_SET(id, (SELECT ifnull(max(ischild), #{id})
                               FROM (SELECT t1.id,
                                            t1.parent_category_id,
                                            IF(FIND_IN_SET(id, @pids) > 0, @pids :=concat(@pids,',',parent_category_id), 'N') AS ischild
                                     FROM (SELECT id, t.parent_category_id
                                           FROM hit_categories t
                                           ORDER BY t.id desc) t1,
                                          (SELECT @pids :=  #{id}) t2) t3
                               WHERE ischild != 'N' ));

问题

  1. 效率问题 find_in_set 影响递归快慢
  2. 主键问题 ID加主键
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值