mysql实现类似oracle的connect by功能

1.生成测试表与数据:
create table mytest
 (
  id int primary key,
  nodename varchar(20),
  pid int
 );
insert into mytest (id,nodename,pid)values(  1 ,‘A‘, 0);
insert into mytest (id,nodename,pid)values(  2 ,‘B‘, 1);
insert into mytest (id,nodename,pid)values(  3 ,‘C‘, 1);
insert into mytest (id,nodename,pid)values(  4 ,‘D‘, 2);
insert into mytest (id,nodename,pid)values(  5 ,‘E‘, 2);
insert into mytest (id,nodename,pid)values(  6 ,‘F‘, 3);
insert into mytest (id,nodename,pid)values(  7 ,‘G‘, 6);
insert into mytest (id,nodename,pid)values(  8 ,‘H‘, 0);
insert into mytest (id,nodename,pid)values(  9 ,‘I‘, 8);
insert into mytest (id,nodename,pid)values( 10 ,‘J‘, 8);
insert into mytest (id,nodename,pid)values( 11 ,‘K‘, 8);
insert into mytest (id,nodename,pid)values( 12 ,‘L‘, 9);
insert into mytest (id,nodename,pid)values( 13 ,‘M‘, 9);
insert into mytest (id,nodename,pid)values( 14 ,‘N‘,12);
insert into mytest (id,nodename,pid)values( 15 ,‘O‘,12);
insert into mytest (id,nodename,pid)values( 16 ,‘P‘,15);
insert into mytest (id,nodename,pid)values( 17 ,‘Q‘,15);

2.创建函数:
delimiter $$
CREATE FUNCTION `getParentList` (rootId VARCHAR (50)) RETURNS VARCHAR (1000)
 BEGIN
  DECLARE sParentList VARCHAR (1000) ;
  DECLARE sParentTemp VARCHAR(1000);
  SET sParentTemp =CAST(rootId AS CHAR);
  WHILE sParentTemp IS NOT NULL DO
  IF (sParentList IS NOT NULL) THEN
  SET sParentList = CONCAT(sParentTemp,‘/‘,sParentList);
  ELSE
  SET sParentList = CONCAT(sParentTemp);
  END IF;
 SELECT GROUP_CONCAT(pid) INTO sParentTemp FROM mytest WHERE FIND_IN_SET(id,sParentTemp)>0;
 END WHILE;
 RETURN sParentList;
 END$$
 DELIMITER ;

3.测试验证:
set global log_bin_trust_function_creators=1;
SELECT id,pid,getParentList(id) FROM mytest;

mysql> SELECT id,pid,getParentList(id) FROM mytest;
+----+------+-------------------+
| id | pid  | getParentList(id) |
+----+------+-------------------+
|  1 |    0 | 0/1               |
|  2 |    1 | 0/1/2             |
|  3 |    1 | 0/1/3             |
|  4 |    2 | 0/1/2/4           |
|  5 |    2 | 0/1/2/5           |
|  6 |    3 | 0/1/3/6           |
|  7 |    6 | 0/1/3/6/7         |
|  8 |    0 | 0/8               |
|  9 |    8 | 0/8/9             |
| 10 |    8 | 0/8/10            |
| 11 |    8 | 0/8/11            |
| 12 |    9 | 0/8/9/12          |
| 13 |    9 | 0/8/9/13          |
| 14 |   12 | 0/8/9/12/14       |
| 15 |   12 | 0/8/9/12/15       |
| 16 |   15 | 0/8/9/12/15/16    |
| 17 |   15 | 0/8/9/12/15/17    |
+----+------+-------------------+
17 rows in set (0.01 sec)

时间: 2024-11-06 12:38:26

mysql实现类似oracle的connect by功能的相关文章

MySQL实现类似Oracle的序列

MySQL实现类似Oracle的序列 2013-10-22 10:33:35     我来说两句      作者:走过的足迹 收藏    我要投稿 MySQL实现类似Oracle的序列 Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的: 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长.开始索引.是否循环等:若需要迁移数据库,则对于主键这块,也是个头大的问题. 本文记录了一个模拟Oracle序列的方案

mysql中类似oracle的over分组实现

今天,看到别人问问题,需求大概是这样的. id s 开始时间 结束时间 1 20 2001-01-01 08:10:20 2001-01-01 08:10:40 1 9 2001-01-01 08:10:41 2001-01-01 08:10:50 1 60 2001-01-01 08:10:51 2001-01-01 08:11:51 1 2 2001-01-01 08:12:51 2001-01-01 08:12:53 2 51 2001-01-01 08:10:00 2001-01-01

MySQL实现类似Oracle序列的函数

drop table if exists sequence; create table sequence ( seq_name VARCHAR(50) NOT NULL, current_val INT NOT NULL, increment_val INT NOT NULL DEFAULT 1, PRIMARY KEY (seq_name) ); drop function if exists currval; create function currval(v_seq_name VARCHA

oracle使用connect by进行级联查询 树型菜单

Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关系的,最顶级的菜单对应的parent_id为0.现假设我们拥有如下记录: id name parent_id 1 菜单01 0 2 菜单02 0 3 菜单03 0 4 菜单0101 1 5 菜单0102

InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能

InnoSQL HA Suite的实现原理与配置说明  InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能 http://www.innomysql.net/article/7403.html Virtual Sync Replication 搭建一个MySQL数据库的复制(replication)环境是相当简单的,这点是MySQL

迁移mysql数据到oracle上

转自:http://www.cnblogs.com/Warmsunshine/p/4651283.html 我是生成的文件里面的master.sql里面的sql,一个一个拷出来的. 迁移mysql数据到oracle上 一.   服务器本地安装Oracle11G或10G 二.   在运行中输入sqlplus /nolog,oracle中创建表空间. 三.   安装完成后在运行中输入 sql developer打开sql developer (就是本机自带的) 四.   选择jdk版路径(jdk版本

MySQL的show profile简介以及该功能在MySQL 5.7中performance_schema中的替代

本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情况,可以在做性能分析或者问题诊断的时候作为参考. 在MySQL5.7中, show profile 命令已经开始不推荐使用,MySQL使用performance_schema 中系统表的信息来替代show profile命令 本文简单介绍一下MySQL的profile使用,以及在MySQL5.7之后

MYSQL登录错误:mysqladmin: connect to server at 'localhost' failed

一.mysql登录错误mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: YES)'无法修改密码用 service mysqld stopmysqld_safe --skip-grant-tables &输入 mysql -uroot -p 回车进入>use mysql;> update user set

Navicat连接mysql出现2003——can't connect to mysql server on localhost(10061)引发的关于人生的思考)

(0)目录 走,是一辈子,不走,也是一辈子(程序猿之路) Navicat连接mysql出现2003--can't connect to mysql server on localhost(10061) 一:起因 (0)最近由于病了一场,闲暇时间(即生病期间)一直思考如下问题: 思考一:如何做一名合格的程序猿,怎么才能成为一名名副其实的程序猿? 思考二:还有就是到底,值不值得熬夜加班去搞研发(或转型或做相对轻松的其它IT岗位~~~对于这个问题,我一时无法给出答案,希望各位帮我分析一下,不胜感激!!