group_concat()拼接当前id的所有父id

一、准备工作

CREATE TABLE `b_km_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) DEFAULT NULL COMMENT '上级id,顶级科目的pid为0',
  `kmname` varchar(200) DEFAULT NULL COMMENT '科目名称',
  `idpath` varchar(4000) DEFAULT NULL COMMENT '路径包括当前id',
  `rootid` int(11) DEFAULT NULL COMMENT '最高一级的id',
  `orgid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=836 DEFAULT CHARSET=utf8;

INSERT INTO `b_km_info` VALUES (1, 0, '收入', '0-0', NULL, NULL);
INSERT INTO `b_km_info` VALUES (2, 0, '支出', '0-0', NULL, NULL);
INSERT INTO `b_km_info` VALUES (3, 1, '外部收入', '0-0-1', NULL, NULL);
INSERT INTO `b_km_info` VALUES (4, 1, '内部收人', '0-0-1', NULL, NULL);
INSERT INTO `b_km_info` VALUES (5, 2, '巴内支出', '0-0-2', NULL, NULL);
INSERT INTO `b_km_info` VALUES (6, 2, '巴外分摊', '0-0-2', NULL, NULL);
INSERT INTO `b_km_info` VALUES (69, 6, '分摊费用', '0-0-2-6', 7, 7);
INSERT INTO `b_km_info` VALUES (70, 3, '培训收入', '0-0-1-3', 7, 7);
INSERT INTO `b_km_info` VALUES (71, 3, '产品收入', '0-0-1-3', 7, 7);
INSERT INTO `b_km_info` VALUES (73, 4, '咨询收入', '0-0-1-4', 7, 7);
INSERT INTO `b_km_info` VALUES (74, 4, '产品收入', '0-0-1-4', 7, 7);
INSERT INTO `b_km_info` VALUES (75, 4, '其它中介', '0-0-1-4', 7, 7);
INSERT INTO `b_km_info` VALUES (76, 5, '人工成本', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (77, 5, '课程成本', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (78, 5, '产品成本', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (79, 5, '活动成本', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (80, 5, '广告费用', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (81, 5, '管理费用', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (82, 5, '税费', '0-0-2-5', 7, 7);
INSERT INTO `b_km_info` VALUES (83, 69, '人工成本', '0-0-2-6-69', 7, 7);
INSERT INTO `b_km_info` VALUES (84, 69, '管理费用', '0-0-2-6-69', 7, 7);
INSERT INTO `b_km_info` VALUES (95, 69, '场地费用分摊', '0-0-2-6-69', 7, 7);
INSERT INTO `b_km_info` VALUES (750, 3, '咨询项目', '0-0-1-3', 7, 7);
INSERT INTO `b_km_info` VALUES (751, 70, '公开课', '0-0-1-3-70', 7, 7);
INSERT INTO `b_km_info` VALUES (752, 70, '内训', '0-0-1-3-70', 7, 7);
INSERT INTO `b_km_info` VALUES (753, 71, '图书', '0-0-1-3-71', 7, 7);
INSERT INTO `b_km_info` VALUES (755, 71, '工具包', '0-0-1-3-71', 7, 7);
INSERT INTO `b_km_info` VALUES (756, 70, '市场演讲', '0-0-1-3-70', 7, 7);
INSERT INTO `b_km_info` VALUES (757, 71, '内参资料', '0-0-1-3-71', 7, 7);
INSERT INTO `b_km_info` VALUES (758, 751, '来电', '0-0-1-3-70-751', 7, 7);
INSERT INTO `b_km_info` VALUES (759, 751, '渠道', '0-0-1-3-70-751', 7, 7);
INSERT INTO `b_km_info` VALUES (760, 751, '自招', '0-0-1-3-70-751', 7, 7);
INSERT INTO `b_km_info` VALUES (761, 752, '来电', '0-0-1-3-70-752', 7, 7);
INSERT INTO `b_km_info` VALUES (762, 752, '渠道', '0-0-1-3-70-752', 7, 7);
INSERT INTO `b_km_info` VALUES (763, 752, '自招', '0-0-1-3-70-752', 7, 7);
INSERT INTO `b_km_info` VALUES (764, 756, '市场部开发', '0-0-1-3-70-756', 7, 7);
INSERT INTO `b_km_info` VALUES (765, 756, '渠道', '0-0-1-3-70-756', 7, 7);
INSERT INTO `b_km_info` VALUES (766, 756, '来电', '0-0-1-3-70-756', 7, 7);
INSERT INTO `b_km_info` VALUES (767, 3, '软件', '0-0-1-3', 7, 7);
INSERT INTO `b_km_info` VALUES (768, 767, '软件公司直销', '0-0-1-3-767', 7, 7);
INSERT INTO `b_km_info` VALUES (769, 767, '软件公司代理商', '0-0-1-3-767', 7, 7);
INSERT INTO `b_km_info` VALUES (770, 767, '培训公司代理商', '0-0-1-3-767', 7, 7);
INSERT INTO `b_km_info` VALUES (771, 767, '咨询项目带销', '0-0-1-3-767', 7, 7);
INSERT INTO `b_km_info` VALUES (772, 750, '来电', '0-0-1-3-750', 7, 7);
INSERT INTO `b_km_info` VALUES (773, 750, '培训', '0-0-1-3-750', 7, 7);
INSERT INTO `b_km_info` VALUES (774, 750, '续单', '0-0-1-3-750', 7, 7);
INSERT INTO `b_km_info` VALUES (775, 750, '客户介绍', '0-0-1-3-750', 7, 7);
INSERT INTO `b_km_info` VALUES (776, 773, '自招', '0-0-1-3-750-773', 7, 7);
INSERT INTO `b_km_info` VALUES (777, 773, '渠道', '0-0-1-3-750-773', 7, 7);
INSERT INTO `b_km_info` VALUES (778, 76, '固定工资', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (779, 76, '销售提成', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (780, 76, '各项津贴', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (781, 76, '其它奖金', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (782, 76, '统筹社保', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (783, 76, '其它福利', '0-0-2-5-76', 7, 7);
INSERT INTO `b_km_info` VALUES (831, 4, '演讲收入', '0-0-1-4', 7, 7);

二、开始拼接

SELECT
    d.id,
    d.kmname,
    -- 3、将父name拼接起来
    GROUP_CONCAT(
        DISTINCT d.parentid
        ORDER BY
            d.parentid SEPARATOR '/'
    ) AS parentidpath
FROM
    (
    -- 2、在1的基础上查询其所有父id
    SELECT e.id, e.pid, e.kmname, e.idpath,
        w.id AS parentid, w.kmname AS parentkmname
    FROM
        b_km_info w,
        (
            -- 1、获取所有最底层的id
            SELECT t.* FROM b_km_info t
            WHERE t.orgid = '7'
            AND t.id NOT IN (
                SELECT pid FROM b_km_info c
                WHERE c.orgid = '7')
        ) e
        WHERE 
        CONCAT('-', e.idpath, '-') LIKE CONCAT("%-", w.id, "-%")
    ) d
GROUP BY d.id

第一步的结果:以id=73这条数据为例
这里写图片描述

第二步的结果:
这里写图片描述

第三步的结果:
这里写图片描述

tip:
group_concat() 函数讲解
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
3、例子:SELECT id,GROUP_CONCAT(score) FROM test GROUP BY id

猜你喜欢

转载自blog.csdn.net/danqiu2017/article/details/80267863