weixin_43115503 2021-11-05 16:12 采纳率: 0%
浏览 37

mysql 在select字段中使用变量和子查询,实现递归查询父节点,查询结果不正确!

我想不使用函数,直接在sql中实现递归查询一个节点的所有父节点,并求所有父节点的id的和,我的思路是在select字段中使用变量和子查询,但查询结果跟想象的不一样!!

表结构是这样的:

建表语句是:

create table menu(
    id int auto_increment,
    name VARCHAR(255),
    parent_id int,
    PRIMARY KEY(id)
) ENGINE=INNODB auto_increment=1 default charset = "utf8";

insert into menu(id, name, parent_id) values(1, 'Home', 0);
insert into menu(id, name, parent_id) values(2, 'About', 1);
insert into menu(id, name, parent_id) values(3, 'Contact', 1);
insert into menu(id, name, parent_id) values(4, 'Legal', 2);
insert into menu(id, name, parent_id) values(5, 'Privacy', 4);
insert into menu(id, name, parent_id) values(6, 'Products', 1);
insert into menu(id, name, parent_id) values(7, 'Support', 1);

 以id=5的节点为例,找出这个节点的所有父节点,并求这些父节点的id的和,sql如下,执行结果是正确的:

select  @r := 5, (select SUM(p_id) from (
	SELECT 
        
        (SELECT @r := parent_id  FROM menu WHERE id = @r) AS p_id
    FROM 
        menu h 
    WHERE @r <> 0 ) t) as num

 查询结果:id=5的节点,其父节点有4、2、1、0,sum为7,结果是正确的:

 但在此基础上,计算所有节点的,结果却跟理论上的不对:

select menu.id, @r := menu.id, (select SUM(p_id) from (
	SELECT 
        
        (SELECT @r := parent_id  FROM menu WHERE id = @r) AS p_id
    FROM 
        menu h 
    WHERE @r <> 0 ) t) as num
from menu

 结果:

怎么会都是0呢?不明白啊

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 18:12
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用