mysql 家谱关系_mysql家谱表查询某人所有后代

CREATE TABLE `people` (

`id` INT(11) NOT NULL,

`name` VARCHAR(50) NULL DEFAULT NULL,

`pid` INT(11) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`)

);

CREATE DEFINER=`root`@`%` PROCEDURE `getChildren`(IN `parentId` INT)

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT '获取某人所有后代'

BEGIN

#存放结果的临时表

DROP TABLE IF EXISTS children;

CREATE TEMPORARY TABLE children SELECT 0 pLevel,p.* FROM `people` p WHERE id=parentId;

#存放中间结果的临时表

DROP TABLE IF EXISTS tem;

CREATE TEMPORARY TABLE tem SELECT id FROM `people` limit 0;

#逐级填充后代

SET @pLevel=1;

REPEAT

#清空上次数据

TRUNCATE TABLE tem;

#将当前level的后代id放入临时表

INSERT INTO tem SELECT p.id FROM `people` P, children c

WHERE p.pid=c.id AND c.pLevel=(@pLevel-1);

#将当前level的后代数据塞入结果临时表

INSERT INTO children SELECT @pLevel pLevel,p.* FROM `people` p, tem t

WHERE p.id=t.id;

SET @pLevel=@pLevel+1;

UNTIL NOT EXISTS (SELECT * FROM tem) OR @pLevel > 10

END REPEAT;

#调整表结构,删除临时列和不需要的数据

ALTER TABLE children DROP COLUMN pLevel;

DELETE FROM children WHERE id=parentId;

#返回结果

SELECT * from children;

END

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值