CREATE TABLE `dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` longtext,
`pid` int(11) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
SELECT *
FROM (
SELECT
t1.*,
IF(FIND_IN_SET(`pid`, @pids) > 0, @pids := CONCAT(@pids, ',', `id`), 0) AS ancestors
FROM
( SELECT * FROM `dept` AS t WHERE t.`status` = 1 ORDER BY t.`id` ASC ) AS t1,
( SELECT @pids := 14 ) AS t2
) AS t3
WHERE
ancestors != 0
or `id` = 14;
t1:获取所有状态正常的数据并升序排列。t2:初始化@pids变量,它用于获取每条记录时缓存父ID。FIND_IN_SET查询当前记录的父ID在@pids中的位置。找不到就返回0。父id拼接到@pids末尾,以便下一条记录继续在@pids中找自己的父id。@pids进行判断。var 结果字段 = '*';
var 表名 = '`sys_dept`';
var 主键 = '`id`';
var 父主键 = '`pid`';
var 状态 = '`status`';
var 要查的主键 = 14;
var 包含当前结点 = true;
var sql = `SELECT ${结果字段}
FROM (
SELECT
t1.*,
IF(FIND_IN_SET(${父主键}, @pids) > 0, @pids := CONCAT(@pids, ',', ${主键}), 0) AS ancestors
FROM
( SELECT * FROM ${表名} AS t WHERE t.${状态} = 1 ORDER BY t.${主键} ASC ) AS t1,
( SELECT @pids := ${要查的当前主键} ) AS t2
) AS t3
WHERE
ancestors != 0
${包含当前结点 ? `or ${主键} = ${要查的主键}` : ''};`;
console.log(sql);
copy(sql);
博客园 - 张亮java:https://www.cnblogs.com/zhangliang88/p/15910781.html