mysql查询子父级节点

目录

        表结构

                查询所有父节点

                查询所有子节点

表结构

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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值