mysql循环查询树状数据
完整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循环查询树状数据的更多相关文章
- MySQL学习——查询表里的数据
MySQL学习——查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 select [distinct] 列1 [as '别名1'], ..., 列n [as '别 ...
- HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- MySql频繁查询、插入数据
当我们需要频繁地从数据库查询.插入数据时,可以将这些数据库操作汇集写到同一个类里,作为工具类直接调用. 将数据库的具体信息保存在.properties文件中,用log4j作为日志记录 MySql.ja ...
- BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...
- ACdream 1127 Base Station (离线查询+树状数组)
题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...
- 树状数据删除(TP5)
应用场景:类似上图中树状菜单,选中一级菜单 点击上方删除按钮 所有子菜单删除 以下是代码截图(代码基于 TP5)
- python连接mysql循环插入千万条数据脚本
之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手.首先需要安装pymysql模块包(模块包安装请自行百度) pip insta ...
- mysql中递归树状结构<转>
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...
随机推荐
- react路由守卫
react没有vue那样的路由钩子beforeEach,实现登陆验证. 实现效果:如果没有登陆,就跳转到登陆界面,如果登陆过浏览器存有登陆信息就跳转到所输入的路由界面,如果该路由不存在则跳到404页面 ...
- Oracle之catalog恢复目录的创建于维护(51CTO风哥rman课程)
catalog恢复目录配置过程 1,创建一个表空间 2,创建rman用户并授权 3,创建恢复目录 4,配置TNS 5,注册数据库 6,检查 创建ramn表空间 首先查看一下其他表空间位置 create ...
- Oracle涂抹oracle学习笔记第8章RMAN说,我能备份
本次测试服务器为172.16.25.33 使用rman连接本地数据库 rman target / 在rman中执行启动与关闭的命令与sqlplus相同 在rman中执行sql语句 sql ‘需要执行的 ...
- Oracle数据库类型date
date日期类型 说明 oracle dd-mm-yyyy create table test1(birthday date); timestamp(n) 说明:邮戳的时间类型 于date的区别,邮戳 ...
- 洛谷P3809 后缀排序【后缀数组】【模板】
题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- 为什么不要使用"using namespace XXX"
为什么不要使用"using namespace XXX" 1.避免降低性能 2.避免Entity冲突 This is not related to performance at a ...
- 为什么 要弄清楚 mysql int(5) int(11) bigint 自建mysql主键id python random 科学计数法
场景: 有1.2亿条问答数据,相同问题的不同答案为不同条的数据,且该表数据逐日递增: 第三方需求(不合理): 将问题.答案数据分别放入问题表.答案表: 问题表的主键为整数,在答案表中,每行数据有相应的 ...
- 洛谷P2024 食物链 [NOI2001] 并查集
正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...
- .NET、NET Framewor以及.NET Core的关系(一)
什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包 ...
- 007-spring cache-缓存实现-02-springboot ehcahe3实现、springboot caffeine实现
一.springboot ehcahe3实现步骤 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛 ...