目录
表结构
CREATE TABLE `address_book` (
`address_book_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_id` int(11) NULL DEFAULT NULL COMMENT '父级ID',
`status` int(11) NULL DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`address_book_id`) USING BTREE
)
address_book:表名
parent_id:父级ID
address_book_id:主键ID
查询所有父节点
--递归查询父节点
SELECT
t2.address_book_id,
t2.project_id,
t2.`name` AS label,
t2.parent_id
FROM
address_book t2
WHERE
t2.parent_id IN (
SELECT
t.parent_id
FROM
(
SELECT
@id AS idlist,
( SELECT @id := GROUP_CONCAT( parent_id SEPARATOR ',' ) FROM address_book WHERE FIND_IN_SET( parent_id, @id ) ) AS sub
FROM
address_book,
( SELECT @id := '-1' ) vars
WHERE
@id IS NOT NULL
) tl,
address_book t
WHERE
FIND_IN_SET( t.parent_id, tl.idlist )
)
AND t.pm_id != '-1' #删掉此条件,可以包含节点自己
查询所有子节点
--递归查询所有子节点
SELECT
t2.*
FROM
(
SELECT
@ids AS p_ids,
( SELECT @ids := GROUP_CONCAT( address_book_id ) FROM address_book WHERE FIND_IN_SET( parent_id, @ids ) ) AS c_ids,
@l := @l + 1 AS LEVEL
FROM
address_book,
( SELECT @ids := '4', @l := 0 ) b
WHERE
@ids IS NOT NULL
) t1
JOIN address_book t2 ON FIND_IN_SET( t2.address_book_id, t1.p_ids )
AND t2.address_book_id != '4';
---方法二
SELECT
dept_id,parent_id,dept_name
FROM
(
SELECT
t1.*,
IF
( FIND_IN_SET( parent_id, @pids ) >0, @pids := CONCAT( @pids, ',', dept_id ), '0' ) AS ischild
FROM
( SELECT * FROM sys_dept AS t ) t1,
( SELECT @pids := '102' ) t2
) t3
WHERE
ischild != '0'