- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 内务整理班会.pptx VIP
- 《世界的物质性》课件.ppt VIP
- 长沙理工大学继电保护课程设计—水电站35kV线路电流保护设计三段式电流保护整定计算工程设计.doc
- 1998—2019北京市中考数学试卷含详细解答(历年真题).pdf VIP
- 2025年新高考英语复习 听力满分策略+真题练习(学生版+解析版)含听力音频 .docx VIP
- DZT0316—2018-砂石行业绿色矿山建设规范.pdf VIP
- T∕BECC 002-2024 智算中心技术要求和评估方法.pdf
- 自我管理(中职通用职业素质课程)全套教学课件(220页).pptx VIP
- 医护人员岗位能力提升策略.pptx VIP
- 智能加工技术:课程标准解读与学习指南.docx VIP
文档评论(0)