MySql 利用函数 查询所有子节点

前提:mysql  函数  find_in_set(str,strlist), cast(value as type)

  一、find_in_set(str,strlist):如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。

              如果str不在strliststrlist为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(‘,‘)时将无法正常运行。

   ①find_in_set(str,strlist)与in()的区别: 当find_in_set(str,strlist)中strlist的值是常数的时候,其效果就相当于in();

    eg:   select * from t_areainfo where FIND_IN_SET(name,‘中国,华北区,华南区‘)  ==  select * from t_areainfo where name in (‘中国‘,‘华北区‘,‘华南区‘)

   ②find_ind_set(str,strlist)与like区别: like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。

    eg: 

select * from t_areainfo t where t.`name` like ‘%XX区%‘

      

select * from t_areainfo t where FIND_IN_SET(‘XX区‘,t.`name`)                                  select * from t_areainfo t where FIND_IN_SET(‘北京XX区4‘,t.`name`)

                   

 二、cast(value as type):用户数据类型转换

      eg:cast(‘1‘ as  int) 将char类型的值‘1‘,转换成 int型的 1;

  言归正传:使用mysql 函数来查找 所有子节点

DROP FUNCTION IF EXISTS queryChildrenAreaInfo;
CREATE FUNCTION `queryChildrenAreaInfo` (areaId INT)  //创建一个函数  queryChildrenAreaInfo(areaId int) 参数为int型RETURNS VARCHAR (4000)                   //定义返回值类型  varchar(4000)
BEGIN                            //函数开始
  DECLARE sTemp VARCHAR (4000);             //定义一个varchar类型的参数
  DECLARE sTempChd VARCHAR (4000);            //定义一个varchar类型的参数
SET sTemp = ‘$‘;                      //给sTmp赋值
SET sTempChd = cast(areaId AS CHAR);          //将函数中的int型的参数转换成 char型  赋值给sTempChd
WHILE sTempChd IS NOT NULL DO              //循环体
SET sTemp = CONCAT(sTemp, ‘,‘, sTempChd);       //拼接sTemp
SELECT group_concat(id) INTO sTempChd FROM  t_areainfo WHERE FIND_IN_SET(parentId, sTempChd) > 0; //根据父节点,查询出该父节点下的所有子节点的id,支持多级查询
END WHILE;
RETURN sTemp;
END;

  调用方式:

select * from t_areainfo t where FIND_IN_SET(id,queryChildrenAreaInfo(4))

  

时间: 2024-10-11 04:46:14

MySql 利用函数 查询所有子节点的相关文章

Oracle树查询(查询所有子节点,父节点等等)_转载

Oracle树查询(查询所有子节点,父节点等等) 转载 2016年01月14日 10:11:55 Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 以我做过的一个项目中的表为例,表结构如下: Sql代码 1

mysql 索引+函数查询

1.建立索引 create table t1( tname varchar(30), key (tname) -- 建立索引的第一种方式 key tt(tname asc)  tt为索引的名字 ); (2)增加主键约束会自带索引 (3)-- 为tname 字段 建立索引名字为tn create index tn on t1(tname desc); (4)create unique index tn on t4(tname desc);-- 建立唯一索引 (5)alter table t add

Oracle树查询(查询所有子节点包含自己)

查询 某ID 所有的子孙包含自己: select * from tableName t start with t.pid = '2c948a836b4f94b4016b5000c386014b' or t.id = '2c948a836b4f94b4016b5000c386014b' connect by t.pid = prior t.id 原文地址:https://www.cnblogs.com/qing-xia/p/11024467.html

SQLServer查询所有子节点

用CTE递归 ;with f as ( select * from tab where id=1 union all select a.* from tab as a inner join f as b on a.pid=b.id ) select * from f

数据表查询所有子/父节点

查询所有子节点 with Select_child(id,parentId,value,level) as( select id,parentid,value,0 as level from ctable where parentid=2 union all select c.id,c.parentid,c.value,sc.level+1 from ctable c inner join Select_child sc on c.parentId=sc.id ) select * from S

MySQL中进行树状所有子节点的查询【转】

在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现. 但很多时候我们无法控制树的深度.这时就需要在MySQL中用存储过程来实现或在你的程序中来实现这个递归.本文讨论一下几种实现的方法.

MySQL递归查询所有子节点,树形结构查询

--表结构 CREATE TABLE `address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code_value` varchar(32) DEFAULT NULL COMMENT '区域编码', `name` varchar(128) DEFAULT NULL COMMENT '区域名称', `remark` varchar(128) DEFAULT NULL COMMENT '说明', `pid` varchar(32) DEFAULT NUL

mysql 常用函数以及常见查询语句

MySQL 常用函数 1.数据库中取昨天的日期 mysql> select date_sub(current_date(),interval 1 day); +-----------------------------------------+ | date_sub(current_date(),interval 1 day) | +-----------------------------------------+ | 2016-01-11                           

SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ID] Int, fatherID Int, [Name] Varchar(10))Insert A Select 1, 0, '中国'Union All Select 2, 1, '广东'Union All Select 3, 1, '北京'Union All Select 4, 2, '深圳特区