MySQL 实现 Oracle 的 Start with…Connect By 递归树查询
3

因项目迁移,使用的数据库也需要从Oracle迁移到MySQL 其中有个功能使用到了Oracle的Start with…Connect By递归树查询,而MySQL中没有此函数,但可以通过自定义函数的方式来解决这个问题

创建表

create table treeList(
   id varchar(10), -- 节点ID
   name varchar(10), -- 节点名称
   pId varchar(10) -- 父ID
)

插入测试数据

insert into treeList values(1,'中国',null);
insert into treeList values(2,'北京',1);
insert into treeList values(3,'上海',1);
insert into treeList values(4,'深圳',1);
insert into treeList values(5,'海淀',2);
insert into treeList values(6,'朝阳',2);
insert into treeList values(7,'昌平',2);
insert into treeList values(8,'丰台',2);

创建函数getChildList

CREATE FUNCTION getChildList (rootId VARCHAR(100)) -- rootId为要查询的节点
RETURNS VARCHAR(1000)
BEGIN
    DECLARE pTemp VARCHAR(1000);  
    DECLARE cTemp VARCHAR(1000); -- 定义两个临时变量

    SET pTemp = '';  
    SET cTemp = rootId;

    WHILE cTemp is not null DO  
       if (pTemp = '') then
         SET pTemp = cTemp;
         elseif(pTemp <> '') then
         SET pTemp = concat(pTemp,',',cTemp); -- 所有节点连接成字符串
         end if;
         SELECT group_concat(id) INTO cTemp FROM treeList   
         WHERE FIND_IN_SET(pId,cTemp)>0; 
     END WHILE;  
     RETURN pTemp;  
END

执行方法 查询节点为“2”下的所有节点

select getChildList('2') as ids

运行结果

原文链接:http://blog.kesixin.xin/article/50

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 4

一般用代码实现,sql没达到这水平

5个月前

@xuanjiang1985 这是Mysql的函数

5个月前
TimJuly
5个月前

@TimJuly 好的,谢谢!

5个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!