完整function

CREATE  FUNCTION `getChildList`(rootId BIGINT, table_name varchar(20)) RETURNS varchar(21845) CHARSET utf8
BEGIN
DECLARE str VARCHAR(21845) ;
DECLARE cid VARCHAR(21845) ; SET str = '';
SET cid =cast(rootId as CHAR); WHILE cid is not null DO
SET str= concat(str,',',cid);
IF table_name = 'tb_menu' THEN
SELECT group_concat(id) INTO cid from tb_menu where FIND_IN_SET(p_id,cid)>0;
ELSEIF table_name = 'tm_service_category' THEN
SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
ELSEIF table_name = 'tm_part_category' THEN
SELECT group_concat(pk_id) INTO cid FROM tm_part_category where is_del = 0 and FIND_IN_SET(p_id,cid)>0;
end IF;
END WHILE;
RETURN str;
END

mysql查询树解析(此处只是简单的循环并非递归):
例如:调用如下

select getChildList(0,tm_service_category)

提炼执行语句

       WHILE cid is not null DO
SET str= concat(str,',',cid);
SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
END WHILE;
RETURN str;
END

tm_service_category 表结构如下

CREATE TABLE `tm_service_category` (
`pk_id` bigint(20) unsigned NOT NULL COMMENT '主键',
`name` varchar(50) DEFAULT NULL COMMENT '名称',
`p_id` bigint(20) unsigned DEFAULT NULL COMMENT '父节点',
PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

最主要的是p_id字段,表示父节点的pk_id

假设有数据如下

pk_id p_id name
1 0 a
2 1 b
3 1 c
4 2 d

树结构如下:

整棵树的根节点为0,二级节点1,三级节点为2,3,四级节点为4

模拟执行循环语句

       WHILE cid is not null DO
SET str= concat(str,',',cid);
SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
END WHILE;
RETURN str;
END getChildList(0,tm_service_category)

1,初始化cid=0
2,查找p_id为0的所有节点拿到所有二级节点赋值给cid,cid=1,str=0,1
3,重复2步操作,查找p_id为1的所有节点拿到所有二级节点赋值给cid,cid=2,3,str=0,1,2,3
4,重复2步操作,查找p_id为2,3的所有节点拿到所有三级节点赋值给cid,cid=4,str=0,1,2,3,4
5,重复2步操作,查找p_id为4的所有节点赋值给cid,没找到任何节点,cid=null,退出循环

mysql循环查询树状数据的更多相关文章

  1. MySQL学习——查询表里的数据

    MySQL学习——查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 select [distinct] 列1 [as '别名1'], ..., 列n [as '别 ...

  2. HDU 4746 莫比乌斯反演+离线查询+树状数组

    题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...

  3. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  4. MySql频繁查询、插入数据

    当我们需要频繁地从数据库查询.插入数据时,可以将这些数据库操作汇集写到同一个类里,作为工具类直接调用. 将数据库的具体信息保存在.properties文件中,用log4j作为日志记录 MySql.ja ...

  5. BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)

    1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...

  6. ACdream 1127 Base Station (离线查询+树状数组)

    题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...

  7. 树状数据删除(TP5)

    应用场景:类似上图中树状菜单,选中一级菜单 点击上方删除按钮 所有子菜单删除 以下是代码截图(代码基于 TP5)

  8. python连接mysql循环插入千万条数据脚本

    之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手.首先需要安装pymysql模块包(模块包安装请自行百度) pip insta ...

  9. mysql中递归树状结构<转>

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

随机推荐

  1. ios unrecognized selector sent to instance出现的原因和解决方案

    概述:造成unrecognized selector sent to instance iphone,大部分情况下是因为对象被提前release了,在你心里不希望他release的情况下,指针还在,对 ...

  2. SpringMVC中使用@ResponseBody注解将任意POJO对象返回值转换成json进行返回

    @ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区. ...

  3. postgresql----数据库表约束----NOT NULL,DEFAULT,CHECK

    数据库表有NOT NULL,DEFAULT,CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY六种约束. 一.NOT NULL ---- 非空约束 NULL表示没有数据,不表示具 ...

  4. pta 习题集5-18 打印学生选课清单

    假设全校有最多40000名学生和最多2500门课程.现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单. 输入格式: 输入的第一行是两个正整数:N(≤≤40000),为前来查询课表的学生 ...

  5. Integer.valueof 和 Integer.parseInt

    System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); System.out.p ...

  6. Python开发【Tornado】:异步Web服务(二)

    真正的 Tornado 异步非阻塞 前言: 其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Torn ...

  7. 拨开障目的叶,一览CMDB庐山真面目

    人们往往用"一叶障目,不见泰山"来形容一个人被局部现象所迷惑,看不到事物发展的整体脉络,从而做出一些不是十分正确的决策.小编觉得对于运维何尝不是这样呢. 大多数企业资产配置维护的现 ...

  8. Windows中杀死某个端口的进程

    最近写项目,总是出现端口被占用的问题,原来傻傻的把电脑重启一下,终于有一天受不了了,想要想办法解决.刚开始从网上找了好多教程,发现不行.开始自己尝试,终于,成功的将占用端口的进程杀掉.在此记录下过程( ...

  9. (1.4)DML增强功能-Output

    Output在CRUD的区别 1.对于INSERT,可以引用inserted表以查询新行的属性.在insert into table output . 2.对于DELETE,可以引用deleted表以 ...

  10. Android仿今日头条手界面

    public class MyIndicator extends HorizontalScrollView implements ViewPager.OnPageChangeListener { pr ...