• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 4年前 (2022-01-09) 17次浏览 已收录 0个评论

本文主要和大家分享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 | Ex<b>本文来源gao@!dai!ma.com搞$$代^@码5网@</b>tra          |+------------+------------------+------+-----+---------+----------------+| 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树查询代码详解的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:25行实现mysql树查询代码详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址