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的目前版本中还没有对应的功能. ...
随机推荐
- Eclipse打包Egret App (Egret4.1.0)
Egret官方提供eclipse和androidstudio打包. 这里使用eclipse. 1 下载配置android环境 2 Egret打包App 3 Eclipse设置 4 Eclipse调试 ...
- [Bootstrap] install Bootstrap framework in window 7 by npm
Install with npm You can also install Bootstrap using npm: $ npm install bootstrap require('bootstra ...
- 最优比例生成环(dfs判正环或spfa判负环)
http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 混合欧拉回路的判断(Dinic)
POJ1637 Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7483 Accepte ...
- 学习认识Spring原理
学习认识Spring原理 Spring 是一种业务层框架.搭建Spring框架需要Spring开发包和commons-logging包.Spring的核心思想是控制反转也称依赖注入(创建者--(实例) ...
- ubuntu下安装meshlab
PPA 安装,打开终端,输入以下命令: sudo add-apt-repository ppa:zarquon42/meshlab sudo apt-get update sudo apt-get i ...
- 使用docx4j编程式地创建复杂的Word(.docx)文档
原文链接:Create complex Word (.docx) documents programatically with docx4j 原文作者:jos.dirksen 发表日期:2012年2月 ...
- Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
背景项目中用到多线程,对线程的执行顺序有要求: A.一个线程先收数据 B.一个线程处理数据 C.一个线程再将处理后的数据发送出去 要求三个线程按照ABC的顺序循环执行. 思路子类化多线程方法 重写子类 ...
- 在一台server上部署多个Tomcat
版权声明: https://blog.csdn.net/u011518709/article/details/27181665 在一台server上配置多个Tomcat的方法: 这几天因为在研究OGS ...
- Elasticsearch环境安装配置
安装Elasticsearch的步骤如下 - 第1步 - 查看安装在计算机上的java的最低版本,它要求java 7或以上或最新的版本.可以通过执行以下操作进行检查 - 在Windows操作系统(OS ...