前言
查询一张无限极表 父子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' ));
问题
- 效率问题 find_in_set 影响递归快慢
- 主键问题 ID加主键