加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2020-12-31 11:50:05 所属栏目:MySql教程 来源:网络整理
导读:以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 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=`

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

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 @[email?protected]+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站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读