25行实现mysql树查询代码详解


本文摘自PHP中文网,作者小云云,侵删。

本文主要和大家分享25行实现mysql树查询代码详解,希望能帮助到大家。

需求:查找当前(任意)级别下的所有子节点。

通过自定义mysql函数实现,先贴代码,后面给出详细说明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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的理解

1

2

每一次循环,通过 GROUP_CONCAT函数找出输入的根节点的直接下级节点,通过GROUP_CONCAT函数得到这些子节点的id组成的字符串。并将这次得到的子字符串作为根节点,去寻找下一级的所有的子节点。

最后找到最后子节点没有下级时候,tempChildStr IS NOT NULL。退出循环,返回结果。

运行结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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树查询代码详解的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

mysql笔记之视图的使用详解

mysql数据库可视化工具sqlyogent怎么用?

mysql的数字类型是什么?

mysql的增删查改语句用法示例总结

lamp 如何修改mysql密码

在vps上如何管理并创建mysql数据库

mysql如何对字段设置自增

hive和mysql的区别是什么

mysql编程中的6个实用技巧

mysq中l建立测试父表、子表及测试用例归纳总结

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...