旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

25行完成mysql树查询代码详解【MySQL教程】,mysql,详解,代码

作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:116评论:0


导读:本文主要和人人分享25行完成mysql树查询代码详解,希望能协助到人人。需求:查找当前(恣意)级别下的一切子节点。经由过程自定义mysql函数完成,先贴代码,背面给出细...
本文主要和人人分享25行完成mysql树查询代码详解,希望能协助到人人。

需求:查找当前(恣意)级别下的一切子节点。

经由过程自定义mysql函数完成,先贴代码,背面给出细致申明:

delimiter $$
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1024)
BEGIN
    DECLARE childListStr VARCHAR(1024);
    DECLARE tempChildStr VARCHAR(1024);
    DECLARE rootIdStr VARCHAR(64);
    SET childListStr=NULL;
    SET rootIdStr=cast(rootId as CHAR);
    myloop: WHILE TRUE
    DO
        SELECT GROUP_CONCAT(id) INTO tempChildStr FROM test where FIND_IN_SET(parrent_id,rootIdStr)>0;
        IF tempChildStr IS NOT NULL THEN
            SET rootIdStr=tempChildStr;
            IF childListStr IS NULL THEN
                SET childListStr=tempChildStr;
            ELSE
                SET childListStr=concat(childListStr,',',tempChildStr);
            END IF;
        ELSE
            LEAVE myloop;
        END IF;
    END WHILE;
  RETURN childListStr;
END $$

建表sql:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parrent_id` int(11) DEFAULT '0',
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| parrent_id | int(11)          | YES  |     | 0       |                |
| name       | varchar(32)      | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

+----+------------+------+
| id | parrent_id | name |
+----+------------+------+
|  1 |          0 | cg1  |
|  2 |          1 | cg2  |
|  3 |          2 | cg3  |
|  4 |          3 | cg4  |
|  5 |          4 | cg5  |
|  6 |          5 | cg6  |
|  7 |          6 | cg7  |
|  8 |          7 | cg8  |
|  9 |          8 | cg9  |
| 10 |          1 | cg10 |
| 11 |          2 | cg11 |
+----+------------+------+

第1行:
delimiter编写函数体内容的时刻,须要运用 DELIMITER 症结字将分隔符先修改成别的,不然编写语句的时刻写到 ';' 的时刻会直接实行,致使函数编写失利

2-4行:mysql函数语法范例,不多诠释

5-9行:定义逻辑所需变量。

childListStr:终究返回的子节点ids_str(比方:"1,2,3,4,5")。
tempChildStr: 暂时子节点ids_str(比方:"1")。
rootIdStr: 输入根节点转换为char范例。

10-23行: 全部函数最症结的处所在while里面临tempChildStr的处置惩罚,以及对 内置函数GROUP_CONCAT和FIND_IN_SET的明白

每一次轮回,经由过程 GROUP_CONCAT函数找出输入的根节点的直接下级节点,经由过程GROUP_CONCAT函数获得这些子节点的id构成的字符串。并将此次获得的子字符串作为根节点,去寻觅下一级的一切的子节点。
末了找到末了子节点没有下级时刻,tempChildStr IS NOT NULL。退出轮回,返回效果。

运转效果:

mysql> select getChildList(1);
+-----------------------+
| getChildList(1)       |
+-----------------------+
| 2,10,3,11,4,5,6,7,8,9 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select getChildList(2);
+------------------+
| getChildList(2)  |
+------------------+
| 3,11,4,5,6,7,8,9 |
+------------------+
1 row in set (0.00 sec)

相干引荐:

SQL语句完成子孙树查询典范实例

mysql-运用MYSQL完成oracle start with connect by递归树查询

Oracle树查询及相干函数

以上就是25行完成mysql树查询代码详解的细致内容,更多请关注ki4网别的相干文章!

标签:mysql详解代码


欢迎 发表评论: