(转)MySql 获取所有级联父级或所有级联子级
2017-07-29 15:57
344 查看
from:https://yq.aliyun.com/articles/48885
最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?
在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!!
下面给出一个
下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。
创建表
插入几条数据
把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId,表明默认treenodes)
执行命令
执行命令
最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?
在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!!
下面给出一个
function来完成的方法
下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。
创建表
treenodes(可以根据需要进行更改)
1 2 3 4 5 6 7 8 9 10 | -- ---------------------------- -- Table structure for `treenodes` -- ---------------------------- DROP TABLE IF EXISTS `treenodes`; CREATE TABLE `treenodes` ( `id` int(11) NOT NULL, `nodename` varchar(20) DEFAULT NULL, `pid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; |
1 2 3 4 5 6 7 8 9 1011 | -- ---------------------------- -- Records of treenodes -- ---------------------------- INSERT INTO `treenodes` VALUES ('1', 'A', '0'); INSERT INTO `treenodes` VALUES ('2', 'B', '1'); INSERT INTO `treenodes` VALUES ('3', 'C', '1'); INSERT INTO `treenodes` VALUES ('4', 'D', '2'); INSERT INTO `treenodes` VALUES ('5', 'E', '2'); INSERT INTO `treenodes` VALUES ('6', 'F', '3'); INSERT INTO `treenodes` VALUES ('7', 'G', '6'); INSERT INTO `treenodes` VALUES ('8', 'H', '0'); INSERT INTO `treenodes` VALUES ('9', 'I', '8'); INSERT INTO `treenodes` VALUES ('10', 'J', '8'); INSERT INTO `treenodes` VALUES ('11', 'K', '8'); INSERT INTO `treenodes` VALUES ('12', 'L', '9'); INSERT INTO `treenodes` VALUES ('13', 'M', '9'); INSERT INTO `treenodes` VALUES ('14', 'N', '12'); INSERT INTO `treenodes` VALUES ('15', 'O', '12'); INSERT INTO `treenodes` VALUES ('16', 'P', '15'); INSERT INTO `treenodes` VALUES ('17', 'Q', '15'); |
根据传入id查询所有父节点的id
1 2 3 4 5 6 7 8 9 1011 | delimiter // CREATE FUNCTION `getParLst`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempPar VARCHAR(1000); SET sTemp = ''; SET sTempPar =rootId; #循环递归 WHILE sTempPar is not null DO #判断是否是第一个,不加的话第一个会为空 IF sTemp != '' THEN SET sTemp = concat(sTemp,',',sTempPar); ELSE SET sTemp = sTempPar; END IF; SET sTemp = concat(sTemp,',',sTempPar); SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; END WHILE; RETURN sTemp; END // |
select getParList(15);结果:
id | nodename | pid |
---|---|---|
8 | H | 0 |
9 | I | 8 |
12 | L | 9 |
15 | O | 12 |
根据传入id查询所有子节点的id
1 2 3 4 5 6 7 8 9 1011 | delimiter // CREATE FUNCTION `getParLst`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '$'; SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0; END WHILE; RETURN sTemp; END // |
select getChildList(7);结果:
id | nodename | pid |
---|---|---|
7 | G |
相关文章推荐
- MSSQL 下递归CTE的应用通过父级获取所有对应的子级节点(一)
- sql 递归函数,根据父级ID获取所有子级(含自己)
- MSSQL 递归CTE的应用通过子级获取所有对应的父级及其本身(二)
- mysql 如何根据父级字段得到所有子级
- 无限极分类mysql存储过程编写实现调用时给定一个id,返回其所有父级与子级并排序
- mysql 根据子级id查询其所有的父级的
- mybatis根据父级编号获取所有的子级
- mysql中使用递归实现父级部门所有子级信息的查询
- Mysql 根据id查所有父级或子级
- mysql 循环 获取部门下面所有子级部门ID
- 根据子级ID获取其所有父级
- Mysql 根据id查所有父级或子级
- jquery父级元素获取所有子级元素
- js和jquery获取父级元素、子级元素、兄弟元素的方法
- MySQL 获取某一个分类ID的所有父或子分类查询结果
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- JS获取节点的兄弟,父级,子级元素
- magento如何获取指定分类的所有上级父类(级联至顶级)
- JS获取节点的兄弟,父级,子级元素
- js和jquery获取父级元素、子级元素、兄弟元素的方法