Mysql递归查询所有父节点.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Mysql递归查询所有⽗节点 准备数据 CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; INSERT INTO `demo` VALUES (1, A, 0); INSERT INTO `demo` VALUES (2, B, 1); INSERT INTO `demo` VALUES (3, C, 1); INSERT INTO `demo` VALUES (4, D, 2); INSERT INTO `demo` VALUES (5, E, 4); INSERT INTO `demo` VALUES (6, F, 1); INSERT INTO `demo` VALUES (7, G, 1); id name parent_id 1 A 0 2 B 1 3 C 1 4 D 2 5 E 4 6 F 1 7 G 1 需求:根据⼀个⼦ID,查询所有⽗类 SELECT t2.id, t2.`name` FROM ( SELECT @r AS _id, (SELECT @r := parent_id FROM demo WHERE id = _id) AS parent_id, @l := @l + 1AS lvl FROM (SELECT @r := 5, @l := 0) vars, demo AS WHERE @r 0 ) t1 JOIN demo t2 ON t1._id = t2.Id 结果如下 id name 1 A 2 B 4 D 5 E 分析过程(答疑过程) 我使⽤将SQL语句拆分的⽅式,并展⽰每句SQL运⾏结果,让各位可以看的更明⽩,以便于根据你⾃⼰的业务需求进⾏更改 1、先不管T2 ,先把T1的SQL抽出来看 SELECT @r AS _id, (SELECT @r := parent_id FROM demo WHERE id = _id) AS parent_id, @l := @l + 1AS lvl FROM (SELECT @r := 5, @l := 0) vars, demo AS WHERE @r 0 从这⾥可以看出,其实T1 已经找出ID为5节点的所有⽗节点了,和T2 (即demo表)进⾏左连接,只不过是为了根据Id获取Name⽽已。⽽且 还可以看出@l其实在整个SQL中并没有什么作⽤,只是⽤来标识节点的等级,底级⼦节点的lvl为1,⽗节点lvl值越⼤表⽰越靠近顶级⽗节 点,想象⼀下树结构,你就明⽩了 2、搞明⽩@r := 5 SELECT @r : 5, @l : 0 从这⾥看出,其实@r,@l 就是⼀个变量⽽已, 作为变量⾃然你可以随便起名,当然也可以随便赋值,改成@a,@b也都是可以的 那这 SQL的意思就出来了,它表⽰给变量@r赋值,值为5,给@l赋值,值为0 因此,其实整个SQL的意思也明了了就是根据⼦ID5,查询所有⽗类 3、搞懂变量@r 值如何变化 @r AS _id, (SELECT @r : parent_id FROM demo WHERE id _id) AS parent_id 根据MYSQL执⾏顺序(在⽂章末尾处),SQL语句在执⾏时会先执⾏From,即会先执⾏上⼀步的赋值操作,因此这⾥的_id值为5,所以上 ⾯的SQL等同于如下SQL 4、所以上⾯的SQL等同于如下SQL SELECT @r

文档评论(0)

洞察 + 关注
官方认证
文档贡献者

博士生

认证主体宁夏三科果农牧科技有限公司
IP属地宁夏
统一社会信用代码/组织机构代码
91640500MABW4P8P13

1亿VIP精品文档

相关文档