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

我们经常会把一些树形的结构放在一张表里,例如家谱,菜单等。这种表最大的问题就是当我们需要查询某个记录的所有子记录时,很难用简单的sql搞定。我们可以专门写个过程来做这种事情,下面是我写的一个例子。fghgfhgfhgf MySQL CREATE TABLE `people` ( `id`

我们经常会把一些树形的结构放在一张表里,例如家谱,菜单等。这种表最大的问题就是当我们需要查询某个记录的所有子记录时,很难用简单的sql搞定。我们可以专门写个过程来做这种事情,下面是我写的一个例子。fghgfhgfhgf

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

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值