mysql 自关联表,以下为向下递归以及向上递归样例。
######1 递归查询前期准备,如果你的表已经存在,可忽略此步。

  • 建表
CREATE TABLE `wq_areainfo` (`id` int(11) NOT null AUTO_INCREMENT,`level` int(11) DEFAULT 0 ,`name` varchar(255) DEFAULT '0',`parentId` int(11) DEFAULT 0,`status` int(11) DEFAULT 0,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
  • 初始化数据
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (1, 0, '中国', 0, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (2, 0, '华北区', 1, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (3, 0, '华南区', 1, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (4, 0, '北京', 2, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (5, 0, '海淀区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (6, 0, '丰台区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (7, 0, '朝阳区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (8, 0, '大兴区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (9, 0, '东城区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (10, 0, '西城区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (11, 0, '崇文区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (12, 0, '宣武区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (13, 0, '石景山区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (14, 0, '门头沟区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (15, 0, '房山区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (16, 0, '通州区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (17, 0, '顺义区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (18, 0, '昌平区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (19, 0, '怀柔区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (20, 0, '平谷区', 4, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (46, 0, '吉林省', 1, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (47, 0, '黑龙江', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (48, 0, '哈尔滨', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (49, 0, '大连', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (50, 0, '沈阳', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (63, 0, '松原', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (64, 0, '吉林市', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (65, 0, '葫芦岛', 46, 0);
INSERT INTO `t_areainfo` (`id`, `level`, `name`, `parentId`, `status`) VALUES (66, 0, '扶余', 46, 0);

######2 向下递归查询当前节点下所有子节点以及籽籽节点

  • 利用find_in_set()函数和group_concat()函数实现递归查询
    其中:group_concat(): 多条记录合成一条记录 ;find_in_set(str, strlist) : 在多条记录中查询特定列 ,str 要查询的字符串 ,strlist 字段名 参数以”,”分隔 如 (1,2,6,8):
DROP FUNCTION IF EXISTS queryChildren;
CREATE FUNCTION queryChildren(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(areaId AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0;
END WHILE;
RETURN sTemp;
END;
  • 调用方式
SELECT queryChildren(1);

  • 查询id为"4"下面的所有节点
SELECT * FROM wq_areainfo WHERE FIND_IN_SET(id,queryChildren(4));

######3 向上递归查询所有父亲以及父亲的父亲

DROP FUNCTION IF EXISTS queryParents;
CREATE FUNCTION queryParents(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);SET sTemp='$';
SET sTempChd = CAST(areaId AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END;
  • 查询id为47的父亲以及父亲的父亲,无限递归查询上一代。
    SELECT * from t_areainfo where FIND_IN_SET(id,queryParents(47));

数据库:sql 递归相关推荐

  1. 计算机导论sql试题,数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  2. 实验四 数据库SQL语言基础编程

    -- 实验四 数据库SQL语言基础编程 -- 实验目的: --  掌握数据库查询语句的编写方法 --  掌握利用查询语言完成基本查询 --  掌握利用SQL语句完成数据的添加.删除.修改操作 -- 实 ...

  3. oracle数据库----SQL语句的实践(应用实例)

    oracle数据库----SQL语句的实践(应用实例) 创建表工资表salary,包括员工号emp_id,员工名emp_name,员工月基本工资monthsal,员工月总发工资totalsal. cr ...

  4. oracle表结构修改回滚,87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚...

    87.Oracle数据库SQL开发之 修改表内存--数据库事务的提交和回滚 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元. 要永久性的记录事务中SQL语句的 ...

  5. 关于数据库SQL优化

    1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬 ...

  6. 从痴迷数据库SQL语句逐渐走进面向对象化(系统的核心以处理对象为主、淡化数据库概念)...

    几年前写信息管理系统都要设计很多很多表,每个表都是自己建立的,然后喜欢用高   性能.高超的SQL语句搞定很多复杂的商业逻辑问题,那SQL语句又长又复杂,一般人   还读不懂,但是代码很少.性能很高, ...

  7. oracle数据库sql培训,Oracle数据库SQL语言实战培训教程(全面、详细、案例、精讲)套餐...

    风哥oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 套餐介绍: 风哥Oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 内容: SQL语言基础入 ...

  8. MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...

    本文主要向大家介绍了SQLServer数据库sql语句中----删除表数据drop.truncate和delete的用法,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 虽 ...

  9. mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失

    [数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失 0 2020-08-03 18:00:30 SQL Server 数据类型 使用场景: 在进行多维度汇总数据时,需要将 ...

  10. NickLee.FortuneBase数据库sql server版本系统配置说明

    最近在51aspx.com上面发布了NickLee.FortuneBase数据库sql server版本,不少朋友对此源码比较感兴趣,针对51aspx上的一些朋友的问题,在这里做一些说明.      ...

最新文章

  1. 使用 .NET 实现 Ajax 长连接
  2. The user specified as a definer ('root'@'%') does not exist
  3. java29:Map
  4. 令子元素垂直居中(并且子元素的高度不固定)
  5. hadoop集群搭建过程中不适用hostname发现slave,而是通过ip
  6. 冲刺阶段(二)第五天 5月16日
  7. bvp解算器是什么_对数小史,以及为什么ln x的导数是1/x
  8. python中的内置函数返回元素_Python内置函数_________用来返回数值型序列中所有元素之和。...
  9. 说点你们不知道的大趋势
  10. 实现鼠标放上高亮显示,鼠标移出显示原来的颜色
  11. 计算机软件工程师报名条件,中级软件工程师证书报考条件有哪些要求?
  12. 网赚项目活动线报监控提醒
  13. linux下解包bin二进制文件_Linux系统bin文件打包方法
  14. 常用颜色RGB、灰度值、取色值、透明度。
  15. 钳位二极管的工作原理
  16. OTA升级的实现原理
  17. anbox 使用情况_最近比较火的Anbox项目
  18. win32获取本地ip
  19. VMware Ubuntu20.04设置共享文件夹
  20. Python 波形处理

热门文章

  1. 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】
  2. JAVA根据word模版使用poi导出word文档,包含图片、文字
  3. 干货知识:高清监控怎么选配交换机
  4. postgresql兼容MySQL on update current_timestamp
  5. CTF学习(二)——信息泄露、密码口令、SQL注入、文件上传
  6. 极坐标系及其他常用坐标系的表示方法
  7. linux中安shell怎么传入参数,【linux】linux 下 shell命令 执行结果赋值给变量【两种方式】...
  8. 使用孪生网络和零样本学习进行文本分类
  9. Netty网络编程实战2,使用Netty开发聊天室功能
  10. MySQL基本增删改查以及搭配node在项目中的操作